D.クレジットカード
Recenltyルバは、クレジットカードを持って、それを使用し始めました。のは、考えてみましょうn個の連続した日ルバは、カードを使用しています。
彼女は彼女の口座にお金0から始まります。
トランザクションは愛i日の夕方に発生します。AI> 0の場合、bourlesはルバの口座に入金されている愛。AI <0の場合、bourlesが引き抜かれる愛。そして、AI = 0なら、ルバの口座にお金の量がチェックされます。
N日間のいずれかの午前中ルバ銀行に行くことができ、彼女の口座にburlesの任意の正の整数量を堆積させます。しかし、制限があります:アカウントに金額がdを超えることはできません。
お金の量は夕方にいくつかのトランザクションによってdよりも大きくなっていることが起こることができます。この場合、答えは次のようになります«-1»。
ルバがこの制限を超えてはならず、また、彼女は毎日彼女のアカウントがチェックされていることを望んでいる彼女の口座に金額非負である(AI = 0日)。これは、銀行に行くために多くの時間を要するので、ルバは彼女が(すべての要件を満たすことが可能である場合)、彼女の口座にいくつかのお金を入金する必要がある最小日数を知りたいです。彼女を助ける!
入力は、
最初の行は二つの整数N、D(105≤1≤nは、1≤D≤109)日の-the数とお金の制限を含んでいます。
AIは、i番目の日の取引を表す - (104≤≤104 AI)、2行目は、n個の整数のA1、A2、...含ま。
出力
印刷-1ルバは、要件が満たされているような方法で彼女の口座にお金を入金することができない場合。それ以外の場合はルバがお金を入金しなければならない日数の最小数を印刷します。
入力
5 10 - 1 5 0 - 5 3
出力
0
入力
3 4 - 10 0 20
出力
- 1
アイデアは:まず、各電荷金として、私たちはただ、我々は負の出力の量をチェックしません、量が無制限のお金を充電することができますDを超えていないアカウントを確認する必要があります-1我々は、日光の量をチェックする機能を持っているので、その日正の数に再充電。今の問題は、日中の任意の日の量はDを超えることができないということであり、最小充電時間が欲しいです。したがって、各時間は、再充電する必要があり、我々はいくつかの電荷として次の接頭辞によって与えられた最大数をできるだけ多くを充電します。今後の最大プレフィックスをf [J]であると仮定すると、時間が唯一のDを充電することができます- [J] fを。(参考ブログ)
ACコード:
#include <ビット/ STDC ++ H.> 使用して名前空間STD; の#define N 1250000 INT ARR [N]; int型 SUM [N]; // 接頭辞とint型 Fを[N]; //は、最大の後ろから出て実行INT 主(){ int型N-、D; scanfの(" %のDの%のD "、およびN-、&D) 用(INT I = 1 ; I <= N; I ++の) scanfの(" %のD "、およびARR [I]) ; SUMは、[ 0 ] = 0 ; のために(INT = I 1、I <= N; I ++は) SUM [I] = SUM [I- 1 ] + ARR [I]; // 接頭辞、および F [N-] = SUM [N-]; のための(INT I = N- 。1 ; I> = 1 ; i-- ) F [I] = MAX(F [Iは、+ 1。 ]、SUM [I]); // 最大 のint ANS = 0 ; // お金の数を増加させる必要が INT RES = 0を ; // お金の量を増加させる必要がある ため(int型 I = 1、私は++;;私は<= N- {) IF(!ARR [I]){ IF([I] + SUM RES < 0){ // マネー範囲- (次の最大値を超えてはならない) RES = + D-(F [I] + RES); ANS + + ; } IF(RES + SUM [I] < 0){ // お金が否定的である場合。満たしてい プット("を-1 " ); 戻り 0 ; } } 他{ IF(RES + SUM [I]> D){ // プット(" -1 " ); リターン 0 ; } } } のprintf(" %d個の\ n " 、ANS)。 リターン 0 ; }