题意:

    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

  

 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;
View Code