连号区间数 题型:枚举

65 阅读1分钟

1.连号区间数 - 蓝桥云课 (lanqiao.cn) 什么是连号区间,拿样例举例:

image.png 总结:对一个区间进行排序,排完序之后的区间是连续的就是连号区间。

解析

image.png 原始做法:

#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: image.png

优化

只能在判断是否为连号区间这个地方进行优化:

#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;
}