洛谷 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);
}