1281 山峰和旗子

用一个长度为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

思路:2分,找到可以插旗子的点,然后二分旗子个数,看是否满足有这么多个
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 int a[50004];
 5 int b[50004];
 6 int s=0;
 7
 8 int slove(int x){
 9     int sum=0,ssum=0;
10     for(int i=2;i<=s;i++){
11         sum+=b[i]-b[i-1];
12        // cout<<i<<" "<<sum<<endl;
13         if(sum>=x){
14             ssum++;sum=0;
15         }
16     }
17   //  cout<<endl;
18     return ssum+1;
19 }
20 int main(){
21     int n;
22     scanf("%d",&n);
23     for(int i=1;i<=n;i++){
24         scanf("%d",&a[i]);
25     }
26
27     for(int i=2;i<n;i++){
28         if(a[i]>a[i-1]&&a[i]>a[i+1]){
29             b[++s]=i;
30         }
31     }
32     int l=1,r=s,mid;
33     int ans=0;
34     while(l<=r){
35         int mid=(l+r)>>1;
36         //cout<<mid<<" "<<slove(mid)<<endl;
37         if(slove(mid)>=mid){
38             ans=mid;
39             l=mid+1;
40         }
41         else r=mid-1;
42     }
43     cout<<ans<<endl;
44 }
时间: 2025-01-01 21:30:57

1281 山峰和旗子的相关文章

[CODEVS 1281] Xn数列

描述 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn http://codevs.cn/problem/1281/ 分析 比较裸的矩阵乘法题, 好久没做了, 写写思路 假设矩阵 A = { {a1, a2}, {a3, a4} }, B = { {b1, b2}, {b3, b4} }. 根据矩阵乘法的计算方法, 有 : A×B = { {a1b1+a2b2, a1b2+a2b4}, {a3b1+a4b3, a3b2+a4b4} }. 那

CODEVS-1531 山峰

题目描述 Description Rocky山脉有n个山峰,一字排开,从西向东依次编号为1, 2, 3, --, n.每个山峰的高度都是不一样的.编号为i的山峰高度为hi. 小修从西往东登山.每到一座山峰,她就回头观望自己走过的艰辛历程.在第i座山峰,她记录下自己回头能看到的山峰数si. 何谓"能看到"?如果在第i座山峰,存在j<k<i,hj<hk,那么第j座山峰就是不可见的.除了不可见的山峰,其余的山峰都是可见的. 回家之后,小修把所有的si加起来得到S作为她此次旅

hdu 1281 二分图残量增广

http://acm.hdu.edu.cn/showproblem.php?pid=1281 每行每列最多放置一个车,所以可以把行号和列号当成点,给定的点当成边进行最大匹配,得到的答案就是最大放置数了 然后,还要求重要点——转化为删除边后得到的最大匹配数是否发生变化的问题 易知重要点一定是模型中产生最大匹配时的边,所以我们枚举这样的边,尝试着删除判断情况 较优的做法是删边时将两个标号标记为未匹配,然后禁用这条边,在原有的基础上进行增广,若没有找到新的增广路,则重要点数+1,把两个标记复原 若找到

【bfs】BZOJ1102- [POI2007]山峰和山谷Grz

最后刷个水,睡觉去.Bless All! [题目大意] 给定一个地图,为FGD想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的.若两个格子有公共顶点,那么他们就是相邻的格子.(所以与(i,j)相邻的格子有(i?1, j?1),(i?1,j),(i?1,j+1),(i,j?1),(i,j+1),(i+1,j?1),(i+1,j),(i+1,j+1)).我们定义一个格子的集合S为山峰(山谷)当且仅当:1.S的所有格子都有相同的高度.2.S的所有格子都联通3.对于

hdu 1281 棋盘游戏(二分匹配)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2905    Accepted Submission(s): 1702 Problem Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽

58. 延绵的山峰

58. 延绵的山峰 ★★☆   输入文件:climb.in   输出文件:climb.out   简单对比时间限制:1 s   内存限制:512 MB 问题描述 有一座延绵不断.跌宕起伏的山,最低处海拔为0,最高处海拔不超过8848米,从这座山的一端走到另一端的过程中,每走1米海拔就升高或降低1米.有Q个登山队计划在这座山的不同区段登山,当他们攀到各自区段的最高峰时,就会插上队旗.请你写一个程序找出他们插旗的高度. 输入文件 第1行,一个整数N(N<=10^6),表示山两端的跨度. 接下来N+1

stack No.2山峰问题

哈哈  想起是暑假在美国第一个题目  值得纪念!! 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<stack> 5 using namespace std; 6 int N,h[15010],n;//n是栈里的元素数量 N是一共有多少山 7 stack<int> s;//建立一个栈 8 int ans; 9 10 int main() 11 { 12

hdu 1281 棋盘游戏【二分匹配】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 题意:中文题目,不描述了. 解法:棋盘的行x看成二分图左边的点,列y看成二分图右边的点,那么就把可以放车的位置看成是一条边,而二分图的最大匹配中x互不相同,y互不相同,所以每个匹配都是不同行不同列,所以最大匹配就是最多可以放的车的数量.而要判断有多少个点是必须放的,只要在得出最大匹配后,每次去掉一个匹配,再去运算看得出的结果是否与原来的最大匹配数相同,若相同就不是必须的,若不相同就是必须的.

HDU 1281 棋盘游戏(二分匹配 与 删边)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 根据题目描述,什么是重要点?在求出最大匹配后,进行枚举,依次删边,看最大匹配数会不会发生改变,改变的话,那么该点就是重要点. #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <