51nod 1285 山峰和分段

来源:互联网 发布:点读包音频切割软件 编辑:程序博客网 时间:2024/05/16 12:16

用一个长度为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示例
12153434123462
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;}


原创粉丝点击