1.连号区间数 - 蓝桥云课 (lanqiao.cn) 什么是连号区间,拿样例举例:
总结:对一个区间进行排序,排完序之后的区间是连续的就是连号区间。
解析
原始做法:
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int N=10010;
int res;
int a[N];
int temp[N];
int main()
{
int n;cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<n;i++)
{
for(int j=i;j<n;j++)
{
memcpy(temp,a,sizeof a);
sort(temp+i,temp+j+1);
bool flag=true;
for(int k=i;k<j;k++)
{
if(temp[k+1]-temp[k]!=1)
flag=false;
}
if(flag)res++;
}
}
cout<<res;
return 0;
}
只能过80%,因为三层循环,n是1e4:
优化
只能在判断是否为连号区间这个地方进行优化:
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int N=10010;
int res;
int a[N];
int main()
{
int n;cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<n;i++)
{
int minv=INF,maxv=-INF; //每一段区间都要重新初始化最大最小值
for(int j=i;j<n;j++)
{
minv=min (minv,a[j]);
maxv=max (maxv,a[j]);
if(maxv-minv==j-i)res++;
}
}
cout<<res;
return 0;
}