1. 程式人生 > >luogu P3817 小A的糖果

luogu P3817 小A的糖果

nbsp fin cnblogs text 應該 sca ostream fine blog

題目描述

小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

貪心,每次貪後一個,不開long long 見祖宗

另外小a的牙應該壞掉了(捂臉)

#include <cstdio>
#include <iostream>
using
namespace std; #define LL long long int a[500003]; LL ans=0; int n,k; int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d",a+i); if(a[i]>k)ans+=(a[i]-k),a[i]=k; } int tmp=0; for(int i=1;i<n;i++) { if(a[i]+a[i+1
]>k) { tmp=(a[i]+a[i+1]-k); ans+=tmp; a[i+1]-=tmp; } } printf("%lld\n",ans); return 0; }

luogu P3817 小A的糖果