CCFCSP非零段划分

题目链接
这道题可以将题目模拟为海水与岛屿的问题;
p为海水深度,假设数组中一个数比其左边与右边的数都大,那么它就是一个峰,反之则是一个谷。
如果p是10001,那么所有地区都在海平面以下,将p慢慢减小会发现逐渐由有山峰露出,露出的峰数目最多的时候即为非零段数目最多的时候。
特别注意: 如果出现了类似于1 2 2 1这种相连的情况,一定要将相连续的2变为1 个,即变为1 2 1,如果不变化,程序会认为此处没有峰,但事实上1 2 2 1在2 2 处形成的平台就是峰。

#include 
#include 
int main()
{
	int n;
	scanf("%d",&n);
	int i,b[n+5],c[10005]={0},a[n+5];//c用来记录海水到达i高度时露出的山峰数
	memset(a,0,sizeof(a));
	
	for(i=1;i<=n;i++){
	scanf("%d",&b[i]);
	}
	b[0]=0;b[n+1]=0;
	int j=1;
	for(i=1;i<=n;i++){
		if(b[i]!=b[i+1]) a[j++]=b[i];
		if(b[i]==b[i+1]){
		while(b[i]==b[i+1]) {
			i++;
		}
		a[j++]=b[i];
		i++;
	}
	}
	a[0]=0;a[n+1]=0;
	for(i=1;i<=n;i++){
		if(a[i]>a[i-1]&&a[i]>a[i+1])//如果此处为峰,那么当p比a[i]小的时候,山峰会露出
		c[a[i]]++;//p为a[i]时的非零段数目++
		else if(a[i]<a[i-1]&&a[i]<a[i+1])//此处是谷,当p比a[i]小的时候也不会露出
		c[a[i]]--;//计数非零段--;
	}
	int max=0,sum=0;
	for(i=10000;i>=0;i--){
		sum=sum+c[i];//海水慢慢下降,将逐渐露出的山峰数目和相加;
		if(sum>max) max=sum;
	}
	printf("%d",max);
	return 0;
}

你可能感兴趣的:(ccfcsp,c语言)