题目链接:http://lx.lanqiao.cn/problem.page?gpid=T2926
首先是暴力代码,蓝桥系统80分
#include<iostream>
#include<algorithm>
using namespace std;
const int N=10010;
int a[N],s[N];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>s[i];
int res=n;//每个数字即为一个连续区间
for(int i=0;i<n;i++)
{
for(int m=0;m<n;m++) //防止每次循环的时候排列好的
a[m]=s[m];
for(int j=i+1;j<n;j++)
{
bool flag=true;//每次进行这次循环,都必须再重新定义一次
sort(a+i,a+j+1);//sort函数的结束位置,是到区间末尾的下一个地址
for(int k=i;k<=j-1;k++)
{
if(a[k+1]-a[k]!=1)
flag=false;
}
if(flag) res++;
}
}
cout<<res<<endl;
return 0;
}
正确代码:
连续区间<=>(Max-Min)==(a-b)
Max,Min分别代表所选取区间的最大值和最小值,a,b分别代表所选取区间的首尾所对应数组的下标
#include<iostream>
#include<algorithm>
using namespace std;
const int N=10010;
int a[N];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
int res=0;
for(int i=0;i<n;i++)
{
int maxx=-1e9,minn=1e9;
for(int j=i;j<n;j++)
{
maxx=max(maxx,a[j]);
minn=min(minn,a[j]);
if(maxx-minn==j-i)
res++;
}
}
cout<<res<<endl;
return 0;
}