一、题目信息
| CSP试题编号: | 202109-2 |
| CSP试题名称: | 非零段划分 |
二、基本思路
岛屿问题的思路,例题可见AcWing2014。
三、代码
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int MH = 10010;
int datas[500005],cnt[MH];//init done zero
//第一个数组用于记录数据值,第二个数组用于记录某一个高度的山顶与山谷个数
int main()
{
int n;
scanf("%d",&n);
datas[0]=datas[n+1]=0;//border
for(int i=1;i<=n;i++)
scanf("%d",&datas[i]);
n = unique(datas,datas+n+2)-datas;
//unique()返回的是地址,用途是去重,这一步去重的同时获取了数据个数
for(int i=1;i<n;i++)//去重后数据共有n个,最后一个数据为n不用
{
if(datas[i-1]<datas[i] && datas[i]>datas[i+1])//peak
cnt[datas[i]]++;
else if(datas[i-1]>datas[i] && datas[i]<datas[i+1])//valley
cnt[datas[i]]--;
//如果此处多一个山峰则cnt加一,若此处多一个山谷则小岛连接cnt减一
//printf("[%d * %d]",cnt[datas[i]],datas[i]);
}
//海水退潮
int now_island=0,max_island=0;
for(int i=MH-1;i>0;i--)
{
now_island+=cnt[i];
max_island = max(now_island,max_island);
}
printf("%d\n",max_island);
return 0;
}
4044

被折叠的 条评论
为什么被折叠?



