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

    题目来源: Codility
    基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
     收藏
     关注
    用一个长度为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

    先求n的因子,由于不是很多,可以全算下,看哪个大就输出哪个。
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N = 5e4+10;
     4 int a[N], n, b[N];
     5 vector<int> vs;
     6 bool ok(int x) {
     7     if(b[n] < x) return false;
     8     int len = n/x;
     9     for(int i = 0; i < x; i ++) {
    10         if(b[(i+1)*len]-b[i*len+1] == 0) return false;
    11     }
    12     return true;
    13 }
    14 int main() {
    15     cin >> n;
    16     for(int i = 1; i <= n; i ++) cin >> a[i];
    17     for(int i = 2; i < n; i ++) {
    18         b[i+1] = (a[i]>a[i-1]&&a[i]>a[i+1]) + b[i];
    19     }
    20     if(!b[n])return 0*printf("0
    ");
    21     // for(int i = 1; i<= n; i ++) printf("%d ",b[i] );printf("
    " );
    22     for(int i = 2; i <= sqrt(n); i ++) {
    23         if(n%i==0) {
    24             vs.push_back(i);
    25             vs.push_back(n/i);
    26         }
    27     }
    28     sort(vs.begin(),vs.end());
    29     for(int i = vs.size()-1; i >= 0; i --) {
    30         if(ok(vs[i])) return 0*printf("%d
    ",vs[i]);
    31     }
    32     printf("1
    ");
    33     return 0;
    34 }
  • 相关阅读:
    css 如何让背景图片拉伸填充避免重复显示
    CDHtmlDialog 基本使用
    RES协议
    Sata win7 热插拔(AHCI)
    __argc和__argv变量
    MFC进度条刷新处理
    SVN强制注释
    自动build服务器 CruiseControl.NET
    opencv Mat 像素操作
    std::string 用法
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/8976881.html
Copyright © 2011-2022 走看看