C. Neo's Escape

题目链接:https://codeforces.com/contest/2108/problem/C

题意:

给定一个数组

我们需要将数组元素从大到小的顺序依次遍历

不过不能改变原数组的顺序,而是通过生成不同的指针

指针可以往左或往右任意移动

求所需指针数量的最小值

思路:

容易知道如果相邻的元素相同时,遍历这些相同的元素和遍历一个相同大小的元素等价

观察到一个一般的序列,若将元素大小看作高度

其元素的连续变化趋势则是锯齿状的,也可以看作起伏的山峰状

由题意我们可以从一个山峰下降到其左右两侧的山脚

却无法从山脚上升到另一个山峰上

因此答案便是山峰的个数,也就是 山峰夹着的山脚的个数+1

只需遍历判断元素的大小关系即可

数组,很神奇吧

void solve(){
    int n;cin>>n;
    vector<int>a(n+1);
    rep(i,1,n){
        cin>>a[i];
    }
    vector<int>b;
    b.pb(0);
    for(int i=1;i<=n;i++){
        if(i==1||a[i]!=a[i-1])b.pb(a[i]);
    }
    int cnt=0;
    int m=b.size()-1;
    for(int i=1;i<=m-1;i++){
        if(b[i]-b[i-1]<0&&b[i]-b[i+1]<0){
            cnt++;
        }
    }
    cout<<cnt+1<<endl;
}
posted @ 2025-05-02 21:50  Marinaco  阅读(87)  评论(0)    收藏  举报
//雪花飘落效果