题目:
小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R]
里的所有元素(即此排列的第L个到第R个元素)递增排序后能得到一个长度为R-L+1的“连续”数列,则称这个区间连号区间。
当N很小的时候,小明可以很快地算出答案,但是当N变大的时候,问题就不是那么简单了,现在小明需要你的帮助。
——
输入格式:
第一行是一个正整数N (1 <= N <= 50000), 表示全排列的规模。
第二行是N个不同的数字Pi(1 <= Pi <= N), 表示这N个数字的某一全排列。
输出格式:
一个整数,表示不同连号区间的数目。
——
样例:
4
3 2 4 1
输出:7
—————————————————————————————————————————————
题目的意思是给出的数列是这个数列的所有排列方式中的其中一个,让我们来找出在给出的这个数列中,有多少个能够形成连号的子数列。
思路:如果区间内 max - min == 区间长度 说明这个区间是连续的。
解释:区间内 max,min内的数字都是大于 min 小于 max 的,如果 max - min = 区间数就说明这写数字布满了区间,又因为是小于max大于min的,所以他们必须是连续的。
#include <iostream>
using namespace std;
int number[50005];
int k;
int main() {
cin >> k;
int ans = 0;
for( int i = 1; i <= k; i++ ) {
cin >> number[i];
}
for( int i = 1; i <= k; i++ ) {
int min = number[i];
int max = number[i];
for( int j = i; j <= k; j++ ) {
if( number[j] > max ) max = number[j];
if( number[j] < min ) min = number[j];
if( j - i == max - min ) ans++;
}
}
cout << ans;
return 0;
}