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

现在要在山峰上插上K个旗子,并且每个旗子之间的距离 >= K,问最多能插上多少个旗子(即求K的最大值)。两个山峰之间的距离为|P - Q|。
以上图为例,高度为:1 5 3 4 3 4 1 2 3 4 6 2。其中可以作为山峰的点为:1 3 5 10。
放2面旗子, 可以放在1 和 5。
放3面旗子, 可以放在1 5 和 10。
放4面旗子, 可以放在1 5 和 10,之后就放不下了。
所以最多可以放3面旗子。
Input
第1行:一个数N,表示数组的长度(1 <= N <= 50000)。 第2 - N + 1行:每行1个数Ai(1 <= Ai <= 10^9)。
Output
输出最多能插上多少面旗子(即求K的最大值)。
Input示例
12 1 5 3 4 3 4 1 2 3 4 6 2
Output示例
3
找到所有山峰,把山峰的位置按顺序存在d数组中,在用二分找到最多的棋子
#include <cstdio>
#include <cstring>
#include <iostream>
#define maxn 50005
#define MOD 1000000007
using namespace std;
typedef long long ll;
int num[maxn], d[maxn];
int n, cnt;
bool judge(int m){
int e = d[0], p = 1;
for(int i = 1; i < cnt; i++){
if(d[i] - e >= m){
p++;
e = d[i];
}
}
if(p >= m)
return true;
return false;
}
int main(){
// freopen("in.txt", "r", stdin);
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", num+i);
for(int i = 1; i < n-1; i++){
if(num[i] > num[i-1] && num[i] > num[i+1]){
d[cnt++] = i;
}
}
if(cnt == 0){
puts("0");
}
else{
int l = 1, r = n;
while(l < r){
int mid = (l + r) >> 1;
if(judge(mid) == false)
r = mid;
else
l = mid + 1;
}
printf("%d\n", l-1);
}
return 0;
}