luogu p3817 小A的糖果

2021-10-19 04:22:06 字數 1358 閱讀 9889

傳送門

小 a 有 \(n\) 個糖果盒,第 \(i\) 個盒中有 \(a_i\) 顆糖果。

小 a 每次可以從其中一盒糖果中吃掉一顆,他想知道,要讓任意兩個相鄰的盒子中糖的個數之和都不大於 \(x\),至少得吃掉幾顆糖。

輸入的第一行是兩個用空格隔開的整數,代表糖果盒的個數 \(n\) 和給定的引數 \(x\)。

第二行有 \(n\) 個用空格隔開的整數,第 \(i\) 個整數代表第 \(i\) 盒糖的糖果個數 \(a_i\)。

輸出一行乙個整數,代表最少要吃掉的糖果的數量。

3 3

2 2 2

1
6 1

1 6 1 2 0 4

11
5 9

3 1 4 1 5

0
樣例輸入輸出 1 解釋

吃掉第 2 盒中的兩個糖果即可。

樣例輸入輸出 2 解釋

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

資料規模與約定

此題是一道貪心。

首先如果第乙個盒子自己已經超過了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 #include const int maxn = 1e5 + 5;

int a[maxn];

int main()

for(int i = 2; i <= n; i++)

}std :: cout << ans << std :: endl;

return 0;

}

ac 100:r33298800

luogu P3817 小A的糖果

小a有n個糖果盒,第i個盒中有a i 顆糖果。小a每次可以從其中一盒糖果中吃掉一顆,他想知道,要讓任意兩個相鄰的盒子中加起來都只有x顆或以下的糖果,至少得吃掉幾顆糖。輸入格式 第一行輸入n和x。第二行n個整數,為a i 輸出格式 至少要吃掉的糖果數量。輸入樣例 1 3 3 2 2 2 輸出樣例 1 ...

luogu P3817 小A的糖果

小a有n個糖果盒,第i個盒中有a i 顆糖果。小a每次可以從其中一盒糖果中吃掉一顆,他想知道,要讓任意兩個相鄰的盒子中加起來都只有x顆或以下的糖果,至少得吃掉幾顆糖。輸入格式 第一行輸入n和x。第二行n個整數,為a i 輸出格式 至少要吃掉的糖果數量。輸入樣例 1 3 3 2 2 2 輸出樣例 1 ...

P3817 小A的糖果

luogu 傳送門 挺好想的貪心 蒟蒻一下就想到啦 我們從前往後處理時,盡量吃後面的糖,因為後面的糖會對後面產生影響,而前面的就不會影響了。不過要開long long 為此我wa了兩個點。include include include include include define ll long l...