您的位置:首页 > 其它

51nod 1285 山峰和分段

2017-08-21 20:23 218 查看
用一个长度为N的整数数组A,描述山峰和山谷的高度。山峰需要满足如下条件, 0 < P < N - 1 且 A[P - 1] < A[P] > A[P + 1]。



以上图为例,高度为:1 5 3 4 3 4 1 2 3 4 6 2。
现在要将整个山分为K段,要求每段的点数都一样,且每段中都至少存在一个山峰,问最多可以分为多少段。

Input
第1行:一个数N,表示数组的长度(1 <= N <= 50000)。
第2 - N + 1行:每行1个数Ai(1 <= Ai <= 10^9)。


Output
输出最多可以将山分为多少段。


Input示例
12
1
5
3
4
3
4
1
2
3
4
6
2


Output示例
3


    题目有坑,只要分的那一段有本来的顶点就好了,不用左右助手

    遍历判断有多少个顶点并记录,然后判断,他说每一段一样,如果不能整除直接跳过

   有答案出来就break; 注意只要有顶点答案默认为1,没有顶点默认为0。

   代码献上:

   #include<iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <cstdio>
#include <stack>
#include <set>
using namespace std;
int shan[50000],ding[50000],i,j,n,sum=0,lon,ans=1,ok=1,k;
int chaxun(int start,int wei)
{
int i=0;
for(i=start;i<wei;i++)
if(ding[i]==1)
return 1;
return 0;
}
int main()
{

memset(ding,0,sizeof(ding));
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&shan[i]);
for(j=1;j<n-1;j++)
{
if(shan[j]>shan[j-1]&&shan[j]>shan[j+1])
{
ding[j]=1;
sum++;
}
}
//cout<<sum;
if(sum==0)
{
cout<<"0";
return 0;
}
while(sum>0)
{
if(n%sum!=0)
{
sum--;
continue;
}
ok=1;
lon=n/sum;//一段的长度
for(i=0;i<n-1;i+=lon)
{
if(chaxun(i,i+lon)==0)
{
ok=0;
sum--;
break;
}
}
if(ok==1)
{
ans=sum;
break;
}
sum--;
}
cout<<ans;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM 51nod 2017