问题描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递增排序后能得到一个长度为R-L+1的“连续”数列,则称这个区间连号区间。 当N很小的时候,小明可以很快地算出答案,但是当N变大的时候,问题就不是那么简单了,现在小明需要你的帮助。 输入格式 第一行是一个正整数N (1 <= N <= 50000), 表示全排列的规模。 第二行是N个不同的数字Pi(1 <= Pi <= N), 表示这N个数字的某一全排列。 输出格式 输出一个整数,表示不同连号区间的数目。 样例输入1 4 3 2 4 1 样例输出1 7 样例输入2 5 3 4 2 5 1 样例输出29
//此题自己刚开始还没有想到思路,全排列显然会爆掉, //参考网上的代码才知道有一个很简单的解法,利用连续数的最大最小的差值=个数 #include<stdio.h> int main() { int s[50005],a,i,min,max,count=0,j; scanf("%d",&a); for( i = 0; i < a; i++) { scanf("%d",&s[i]); } for( i = 0; i <a;i++ ){ min=s[i]; max=s[i]; for( j = i; j <a; j++) { if(min>s[j]){min =s[j];} if(max<s[j]){max =s[j];} if((max-min)==(j-i)){ printf("%d %d]\n",i,j); count++; } } } printf("%d",count); return 0; }
连号区间数
最新推荐文章于 2023-03-08 21:04:07 发布