• [牛客小白月赛4 H] 相邻的糖果


    Description

    有n个盒子摆成一排,每个盒子内都有ai个糖果。
    现在你可以执行以下操作:
    ·你可以选择任意一个盒子,在选择的盒子内吃掉一个糖果。
    对你的要求如下:
    ·任何m个相邻的盒子内糖果数量不能超过x个。
    请问,实现要求的最少操作次数是多少?

    Input

    第一行三个数字n, m, x ((2 ≤ n,m ≤ 10^6,1 ≤ x ≤ 10^9))。第二行n个数字((1 ≤ ai ≤ 10^9))

    Output

    输出一个操作数,代表实现要求的最少操作数。

    Solution

    感觉有点像滑动窗口。

    从左往右扫过,维护当前区间的和。

    如果大于 (x),那么令 (val[i]-=(tot-x),tot=x)

    注意左边界即

    if(i>m)
        tot-=val[i]
    

    这样可以解决 (val[i]) “不够” 的情况。

    Code

    #include<cstdio>
    #define N 1000005
    #define int long long
    
    int n,m,x;
    int val[N],ans;
    
    signed main(){
        scanf("%lld%lld%lld",&n,&m,&x);
        int tot=0;
        for(int i=1;i<=n;i++){
            scanf("%lld",&val[i]);
            tot+=val[i];
            if(i>m) tot-=val[i-m];
            if(tot>x)
                val[i]-=tot-x,ans+=tot-x,tot=x;
        }
        printf("%lld
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    python之线程queue
    python多线程之threading模块
    原型模式
    设计模式之工厂方法模式
    装饰模式
    策略模式
    工厂模式之简单工厂模式
    python之SocketServer
    python之socket网络编程
    下载好的vue项目如何在自己电脑环境上运行,步骤!!
  • 原文地址:https://www.cnblogs.com/YoungNeal/p/9191769.html
Copyright © 2020-2023  润新知