zoukankan      html  css  js  c++  java
  • 51Nod1285 山峰和分段

    Problem

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

    现在要将整个山分为K段,要求每段的点数都一样,且每段中都至少存在一个山峰,问最多可以分为多少段。

    Solution

    枚举因数,前缀和优化查询。

    复杂度是因子之和,试了一下,1e6之内一个大于5*n的也没有,最大比率4.5多一点。

    Code

    #include<stdio.h>
    #include<set>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #define mem(ss) memset(ss,0,sizeof(ss))
    #define rep(d, s, t) for(int d=s;d<=t;d++)
    #define rev(d, s, t) for(int d=s;d>=t;d--)
    typedef long long ll;
    typedef long double ld;
    typedef double db;
    #define io_opt ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
    using namespace std;
    int n;
    int a[50020];
    int sum[50020];
    int main() {
        io_opt;
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
        }
        for(int i=2;i<=n-1;i++){
            if(a[i]>a[i-1]&&a[i]>a[i+1]){
                sum[i]=1;
            }
            sum[i]+=sum[i-1];
        }
        sum[n]=sum[n-1];
        for(int i=n;i>=1;i--){
            if(n%i==0){
                bool fg=true;
                int l=n/i;
                for(int j=1;j<=i;j++){
                    if(sum[j*l]-sum[(j-1)*l]<1){
                        fg=false;
                        break;
                    }
                }
                if(fg){
                    cout<<i<<endl;
                    return 0;
                }
            }
        }
        cout<<"0"<<endl;
        return 0;
    }
    
  • 相关阅读:
    WordCount
    vs2013安装及测试
    阅读程序,回答问题
    补作业:随机生成二元四则运算
    第一次合作
    漫漫“码农”路
    我的进度条
    Believe
    软件工程个人总结
    结队作业——电梯调度程序
  • 原文地址:https://www.cnblogs.com/sz-wcc/p/11704723.html
Copyright © 2011-2022 走看看