傳送門
小 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...