51nod 1285山峰和分段
收藏
关注
用一个长度为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 }