问题描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在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 样例输出2 9
代码如下:
1 #include <bits/stdc++.h> 2 3 int main(void) 4 { 5 int n,max,min,sum=0; 6 int a[50000+1]; 7 scanf("%d",&n); 8 for (int i=0; i<n ; i++) 9 scanf("%d",&a[i]); 10 11 for (int i=0 ; i<n ; i++) 12 { 13 max=min=a[i]; 14 for (int j=i ; j<n ; j++) 15 { 16 if (a[j]>max) 17 { 18 max = a[j]; //寻找区间最大值 19 } 20 else if (a[j]<min) 21 { 22 min = a[j]; //寻找区间最小值 23 } 24 25 if (max-min==j-i) //区间最大值与最小值之差,等于区间边界下标之差,即为"连续" 26 { 27 sum ++; 28 } 29 } 30 } 31 printf("%d",sum); 32 33 return 0; 34 }
解题思路:
遍历数据的时候,查找区间的最大值与最小值
如果当区间的最大值-最小值 = 左区间下标-右区间下标,即该区间为连号区间