Codeforces Round #695 (Div. 2) B. Hills And Valleys(思维+贪心+模拟)

CF 同时被 2 个专栏收录
284 篇文章 1 订阅
61 篇文章 0 订阅

给出 n 个数,如果 a[i]>a[i-1] && a[i]>a[i+1] 或者  a[i]<a[i-1] && a[i]<a[i+1] 那么称 a[i] 为山峰或山谷,可以改变一个数,问改变一个数之后,数列中剩下的山峰山谷的个数最少有几个

 我们很容易想到当有 山峰-山谷-山峰的时候可以一下消去 3 个,这是最优的;

其次如果单个山峰或山谷,只消去 1 个,这是最差的

当 山峰-山谷 时,不可能两个山峰同时出现,好的情况可以将两个都删掉,但是有可能会重新造出一个来,比如  4 5 2 3 5,这种情况讨论起来比较繁琐,所以我们直接模拟

对于谷底 a[i] 来说,将其变为 a[i+1] a[i-1] 之中最大的那一个是最优的,但是对于峰顶来说将其变为 最小的那个是最优的

按照上述思路模拟即可

const int N=3e5+5;

    int n,m;
    int i,j,k;
    int a[N];

bool judge(int x)
{
    if(x==1 || x==n) return 0;
    if(1ll*(a[x]-a[x-1])*(a[x]-a[x+1])>0) return 1;
    else return 0;
}

int main()
{
    rush(){
        sd(n);
        int ans=0,res=0,flag=0;
        for(int i=1;i<=n;i++) sd(a[i]);
        for(int i=2;i<=n-1;i++) if(judge(i)) ans++;
        for(int i=2;i<=n-1;i++){
            int tmp=a[i];
            res=judge(i-1)+judge(i)+judge(i+1);
            a[i]=a[i-1];
            int x=judge(i-1)+judge(i)+judge(i+1);
            a[i]=a[i+1];
            int y=judge(i-1)+judge(i)+judge(i+1);
            flag=max(max(res-x,res-y),flag);
            a[i]=tmp;
        }
        pd(ans-flag);
    }
    //PAUSE;
    return 0;
}

 

  • 0
    点赞
  • 2
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值