题意:
Recenlty Luba有一张信用卡,一开始金额为0,每天早上可以充值任意数量的钱,但有限制,卡里的钱不能超过D。到了晚上,银行会对信用卡进行一次操作,操作有三种:
1.a[i]>0,、充入a[i]元。 2.、a[i]<0 、扣除a[i]元。 3.、a[i]=0 查询卡里的金额。
若干在a[i]=0时,卡里的钱为负的或者某天卡里的钱>D,则卡将被冻结,问Recenlty Luba至少需要去银行存多少次钱,使得在接下来的n天里,银行卡不会被冻结。
思路:
贪心,当a[i]=0时,存入的钱的下界就是使得sum(总金额)=0,当每次需要存钱时以下界去存,还会使得钱超过D,则必定会被冻结。
在不被冻结的基础上,当a[i]=0时,存入钱的上界为sum=d,但后面当sum>d是,要将sum变为D
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 cin>>n>>d;tmp=0; 2 int mk=1; 3 For(i,1,n) { 4 cin>>a[i]; 5 if(a[i]!=0) tmp+=a[i]; 6 else if(tmp<0) tmp=0; 7 if(tmp>d) mk=0; 8 } 9 if(!mk) {cout<<-1<<endl;return ;} 10 tmp=0; 11 int ans=0; 12 For(i,1,n){ 13 if(a[i]!=0) tmp+=a[i]; 14 if(tmp>d) tmp=d; 15 if(a[i]==0 && tmp<0) tmp=d,ans++; 16 } 17 cout<<ans<<endl;