用一个长度为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
割开后,原来是山峰的依旧是山峰。。。。。艹,这个坑了两天!!!!!!!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=50000+10;
int a[maxn],pre[maxn],vis[maxn];
int main()
{
int n,i,j,k,temp,num,z;
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",&a[i]);
k=0;
for(i=2;i<n;i++) {
if(a[i]>a[i-1] && a[i]>a[i+1]) {
vis[i]=1; //存在山峰,标记一下
k++; //山峰的个数
}
}
pre[0]=0;
for(i=1;i<=n;i++) {
pre[i]=pre[i-1];
if(vis[i]) pre[i]++;
}
for(i=k;i>0;i--) {
if(n%i) continue; // 将山峰分成i段
z=n/i; //z为山峰的长度
for(j=z;j<=n;j+=z) {
if(pre[j]-pre[j-z]==0) break; //z长度下山峰的数量
}
if(j>n) break;
}
printf("%d\n",i);
return 0;
}