首页 > 其他分享 >山峰和旗子

山峰和旗子

时间:2024-07-20 13:51:13浏览次数:10  
标签:山峰 int ++ num peak 旗子

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

https://upload.51nod.com/User_Upload/43729/root/%E9%A2%981281.png

以本图为例,高度为: 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≤109) 。

Output

输出最多能插上多少面旗子(即求 K 的最大值)。

Sample 1

Inputcopy Outputcopy
12
1
5
3
4
3
4
1
2
3
4
6
2 3

思路

先统计是山峰的点

code

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
int n, m;
const int N = 5e4 + 5;
int num[N], peak[N];//peak存入山峰的点
int k = 0;//山峰个数
bool check(int x){
    //第一个山峰肯定要插旗子
    int prev = peak[0];//prev先初始化为第一个山峰点
    int cnt = 0;//记录所插旗子个数
    for(int i = 1; i < k; i++){
        int pos = peak[i];
        if(pos - prev >= x){
            cnt++;
            prev = pos;
        }
    }
    return cnt >= x - 1;
}
int main() {
    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> num[i];
    }

    for (int i = 1; i < n - 1; ++i) {
        if(num[i] > num[i - 1] && num[i] > num[i + 1]){
            peak[k++] = i;
        }
    }
    if(k == 0){
        cout << 0;
        return 0;
    }
    if(k == 1){
        cout << 1;
        return 0;
    }
    //二分旗子个数
    int result = 0;
    int l = 2, r = k;
    while(l <= r){
        int mid = (l + r) >> 1;
        if(check(mid)){
            result = mid;
            l = mid + 1;
        }else{
            r = mid - 1;
        }
    }
    cout << result;
    return 0;
}

标签:山峰,int,++,num,peak,旗子
From: https://www.cnblogs.com/6Luffy6/p/18313022

相关文章

  • 通达信山峰山谷指标公式源码副图
    {股票指标}VAR1:=(CLOSE-LLV(LOW,45))/(HHV(HIGH,45)-LLV(LOW,45))*100;山峰:SMA(VAR1,5,1)-8,LINETHICK2,COLORCYAN;stICKLINE(山峰,0,山峰,1,0),COLORC8FF00;VAR2:=(CLOSE-LLV(LOW,13))/(HHV(HIGH,13)-LLV(LOW,13))*100;VAR3:=Sma(VAR2,5,1)-16;STICKLINE(VAR3>山峰,0......
  • 推旗子
    #include<bits/stdc++.h>usingnamespacestd;intmain(){inth=8,l=8,a_h,a_l,b_h,b_l;charqi,zhi;cin>>a_h>>a_l>>b_h>>b_l;while(1){for(inti=1;i<h;i++){for(intj=1;j<l;j++)......
  • 题解 P7250 [BalticOI 2012 Day1] 山峰
    通过观察,可以发现此题和最小生成树十分相似(两个地点之间途经的最小值最大)。于是可以考虑这么做:通过bfs将每一个块预处理出来,并记录其编号、高度、类型(是否为高地)以及边缘的点。将每一个块按高度从大到小排序。依次枚举每个块:对于当前要处理的块,枚举其边界的所有点,......
  • 程序员代码面试指南第二版 11.可见的山峰对数量(普通和进阶)
    ​​welcometomyblog​​程序员代码面试指南第二版11.可见的山峰对数量(普通和进阶)题目描述题目描述一个不含有负数的数组可以代表一圈环形山,每个位置的值代表山的高......
  • 2022年春秋杯春季-勇者山峰-部分WriteUp
    关注公众号看图弹钢琴得到flag2、Mercy-code<?phphighlight_file(__FILE__);if($_POST['cmd']){$cmd=$_POST['cmd'];if(';'===preg_replace('/[a-z_]+\((?......