教育Codeforcesラウンド33 D [貪欲タイトル:接頭辞+接尾最も価値と良い質問](ディビジョン2の定格。)

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 ; 
}

 

 

おすすめ

転載: www.cnblogs.com/pengge666/p/11512315.html