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\n");
21     // for(int i = 1; i<= n; i ++) printf("%d ",b[i] );printf("\n" );
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\n",vs[i]);
31     }
32     printf("1\n");
33     return 0;
34 }

 

posted @ 2018-05-01 17:39  starry_sky  阅读(275)  评论(0编辑  收藏  举报