题意:
就是给你n个盒子,里面有糖果,现在问你最少要吃多少糖果,才能让任意连续m个盒子的糖果不超过k。
思考:
刚开始我感觉还是啥dp难题…,其实刚开始先把前m个看看,最少要吃多少,然后往右边走,如果能不吃就不吃,如果需要吃就吃。
因为什么的,因为前m个已经满足条件了,然后往后走一格,会加一些数,同时会减去最开始的数,如果加的这个数为0,肯定也是满足的,所以看看最少能吃多少就行了,不要想的太复杂。贪心的策略是尽量吃右边的。
代码:
int T,n,m,k;
int va[N];
signed main()
{
IOS;
cin>>n>>m>>k;
for(int i=1;i<=n;i++) cin>>va[i];
int ans = 0,anw = 0;
for(int i=1;i<=m;i++)
{
int can = k-ans;
ans += min(va[i],can); //看看这里面能剩多少
anw += va[i]-min(va[i],can);
va[i] = min(va[i],can); //剩下的
}
for(int i=m+1;i<=n;i++)
{
ans -= va[i-m]; //出去的
int can = k-ans;
ans += min(va[i],can);
anw += va[i]-min(va[i],can);
va[i] = min(va[i],can);
}
cout<<anw;
return 0;
}
总结:
多多思考,别想复杂。