洛谷 P3817 小A的糖果 - 貪心、模擬

洛谷 P3817 小A的糖果

題目鏈接:洛谷 P3817 小A的糖果

算法標籤: 貪心模擬

題目

題目描述

小A有N個糖果盒,第i個盒中有a[i]顆糖果。

小A每次可以從其中一盒糖果中吃掉一顆,他想知道,要讓任意兩個相鄰的盒子中加起來都只有x顆或以下的糖果,至少得吃掉幾顆糖。

輸入格式

第一行輸入N和x。

第二行N個整數,爲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

第二盒吃掉6顆,第四盒吃掉2顆,第六盒吃掉3顆。

30%的測試數據,2<=N<=20,0<=a[i], x<=100

70%的測試數據,2<=N<=1000,0<=a[i], x<=10^5

100%的測試數據,2<=N<=10^5,0<=a[i], x<=10^9

題解:

貪心

一道貪心思路的題。

首先我們可以考慮一個問題,如果對於最左側的1號和2號盒子中的糖果,一定是吃2號盒子中的最優!!!(因爲一號盒子不會對其他盒子再產生影響,但是二號盒子可以影響三號盒子)所以我們每次都吃掉後邊一個盒子的糖果(糖吃多了會蛀牙誒)。

符合貪心策略,我們找每一個盒子,如果兩個盒子的和大於了給定的\(X\),那麼我們就吃後一個盒子當中的糖果。統計\(ans\)記錄吃的糖果數,最終輸出即可。

不要忘記數據範圍是需要開long long的!!!

AC代碼

#include <bits/stdc++.h>

using namespace std;

long long n, m, ans, num[100100];

int main()
{
    scanf("%lld%lld", &n, &m);
    for (int i = 1; i <= n; i ++ )
    {
        scanf("%lld", &num[i]);
    }
    for (int i = 1; i < n; i ++ )
    {
        if (num[i] + num[i + 1] > m)
        {
            ans = ans + num[i] + num[i + 1] - m;
            num[i + 1] = m - num[i];
        }
    }
    printf("%lld\n", ans);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章