问题描述
小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递增排序后能得到一个长度为R-L+1的“连续”数列,则称这个区间连号区间。 当N很小的时候,小明可以很快地算出答案,但是当N变大的时候,问题就不是那么简单了,现在小明需要你的帮助。 输入格式
第一行是一个正整数N ( <= N <= ), 表示全排列的规模。 第二行是N个不同的数字Pi( <= Pi <= N), 表示这N个数字的某一全排列。 输出格式
输出一个整数,表示不同连号区间的数目。 样例输入1 样例输出1 样例输入2 样例输出2
题目描述
代码如下:
#include <bits/stdc++.h> int main(void)
{
int n,max,min,sum=;
int a[+];
scanf("%d",&n);
for (int i=; i<n ; i++)
scanf("%d",&a[i]); for (int i= ; i<n ; i++)
{
max=min=a[i];
for (int j=i ; j<n ; j++)
{
if (a[j]>max)
{
max = a[j]; //寻找区间最大值
}
else if (a[j]<min)
{
min = a[j]; //寻找区间最小值
} if (max-min==j-i) //区间最大值与最小值之差,等于区间边界下标之差,即为"连续"
{
sum ++;
}
}
}
printf("%d",sum); return ;
}
C++解法
解题思路:
遍历数据的时候,查找区间的最大值与最小值
如果当区间的最大值-最小值 = 左区间下标-右区间下标,即该区间为连号区间