• [luogu p3817] 小A的糖果


    传送门

    小A的糖果

    题目描述

    小 A 有 (n) 个糖果盒,第 (i) 个盒中有 (a_i) 颗糖果。

    小 A 每次可以从其中一盒糖果中吃掉一颗,他想知道,要让任意两个相邻的盒子中糖的个数之和都不大于 (x),至少得吃掉几颗糖。

    输入输出格式

    输入格式

    输入的第一行是两个用空格隔开的整数,代表糖果盒的个数 (n) 和给定的参数 (x)

    第二行有 (n) 个用空格隔开的整数,第 (i) 个整数代表第 (i) 盒糖的糖果个数 (a_i)

    输出格式

    输出一行一个整数,代表最少要吃掉的糖果的数量。

    输入输出样例

    输入样例 #1

    3 3
    2 2 2
    

    输出样例 #1

    1
    
    

    输入样例 #2

    6 1
    1 6 1 2 0 4
    

    输出样例 #2

    11
    

    输入样例 #3

    5 9
    3 1 4 1 5
    

    输出样例 #3

    0
    

    说明

    样例输入输出 1 解释

    吃掉第 2 盒中的两个糖果即可。


    样例输入输出 2 解释

    第 2 盒糖吃掉 (6) 颗,第 4 盒吃掉 (2) 颗,第 6 盒吃掉 (3) 颗。


    数据规模与约定

    • 对于 (30\%) 的数据,保证 (n leq 20)(a_i, x leq 100)
    • 对于 (70\%) 的数据,保证 (n leq 10^3)(a_i, x leq 10^5)
    • 对于 (100\%) 的数据,保证 (2 leq n leq 10^5)(0 leq a_i, x leq 10^9)

    分析

    此题是一道贪心。

    首先如果第一个盒子自己已经超过了x颗糖,显然必须把多余的吃掉。

    那么接下来如果第一个盒子和第二个盒子中的糖果数量之和仍然(> x),怎么办呢?

    如果吃第一个盒子,那么只会影响到一个分组(1, 2)。

    但如果是吃第二个,会影响到两个(1, 2) (2, 3)。

    所以应该优先贪心吃第二个盒子里的糖,一直到恰好(= x)

    这个时候我们就可以假设第一个盒子不存在了,因为之后所有的操作都和第一个盒子无关,这样的话又回到了前面的问题。

    总之,就是优先择后原则。

    上代码:

    代码

    /*
     * @Author: crab-in-the-northeast 
     * @Date: 2020-05-02 23:29:11 
     * @Last Modified by: crab-in-the-northeast
     * @Last Modified time: 2020-05-02 23:50:54
     */
    #include <iostream>
    #include <cstdio>
    
    const int maxn = 1e5 + 5;
    
    int a[maxn];
    
    int main() {
        int n, x;
        long long ans = 0;
        std :: cin >> n >> x;
        for(int i = 1; i <= n; i++)
            std :: cin >> a[i];
        if(a[1] > x) {
            ans += a[1] - x;
            a[1] = x;
        }
        for(int i = 2; i <= n; i++) {
            if(a[i] + a[i - 1] > x) {
                ans += a[i] + a[i - 1] - x;
                a[i] = x - a[i - 1];
            }
        }
        std :: cout << ans << std :: endl;
        return 0;
    }
    

    评测记录

    AC 100:R33298800

  • 相关阅读:
    发改委-国资委
    IE6 — 你若安好,便是晴天霹雳 [ 乱弹 ]
    Java实现LeetCode_0001_Two Sum
    Java实现LeetCode_0014_LongestCommonPrefix
    Java实现LeetCode_0014_LongestCommonPrefix
    Java实现LeetCode_0007_ReverseInteger
    Java实现LeetCode_0007_ReverseInteger
    Java实现LeetCode_0007_ReverseInteger
    Java实现LeetCode_0014_LongestCommonPrefix
    Java实现LeetCode_0014_LongestCommonPrefix
  • 原文地址:https://www.cnblogs.com/crab-in-the-northeast/p/luogu-p3817.html
Copyright © 2020-2023  润新知