题目详细:
解题思路:
对于这个题目
如果一开始没有思路的话
我们可以先想一下暴力写法
暴力的话就是不断的枚举
每个区间
然后判断这个区间是否合法
这样写下来用了三重循环
而对于题目我们只能通过部分样例
所以我们就要想办法取缩减它的时间
对于遍历每个区间
我们进行优化的有点困难
所以我们就把矛头指向
判断合法
对于合法的序列我们可以
发现只要求出序列中最大值和最小值
然后判断他们之间的差
是否等于区间范围大小即可
(因为所给的是一个排列,所有的数只能出现一次,如果合法,最大值和最小值的取值的差就已经是范围的差了)
代码详解:
#include<iostream>
#include<cmath>
using namespace std;
const int N=1e4+6;
int a[N];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
}
//因为只取一个数一定能满足条件,故一开始把只取一个数的情况全部相加
int ans=n;
for(int i=1;i<=n;i++){
int minn=a[i],maxx=a[i];
for(int j=i+1;j<=n;j++){
if(a[j]>maxx) maxx=a[j];//取最大
if(a[j]<minn) minn=a[j];//取最小
if(maxx-minn==j-i){判断是否合法
ans++;
}
}
}
cout<<ans;
return 0;
}
PS:革命尚未成功,同志仍需努力