間食
表n上スナックの袋があり、異なったスナックは減衰とおいしいのWi度ジの異なる程度を有する、時間の単位で各スナックはおいしいジの程度を減少させるが、ゼロ以下に低下しません。
単位時間当たりのQWBは、スナックの袋を食べることができます。今、あなたはすべての美味しい軽食が利用可能に食べた後最大限にしたいQWB。Q.最大とは何ですか?
入力
最初の行、整数N、n行の次の代表スナックの袋、各々が2のWiおよびジ(1 <= N <=10万)、(0 <=のWi <=10億)の整数の行(0 <=ディ<= 10,000)
出力
出力ライン、最大のおいしさ。
4
5 3
4 3
5 4
7 5
9
被験者は、美味しい損失の代表値の減衰速度ので、少し難しい、と貪欲の減衰速度の対象感じる貪欲、まだあります
だから私たちはおいしい損失が小さい選択しようとする必要がありますが、おいしいスナックの値はその減衰率、およびこの時間未満がある場合には、減衰率を変更する必要があります。
#include <cstdioを> する#include <CStringの> する#include <cstdlib> の#include <アルゴリズム> の#include <地図> の#include <キュー> の#include <ベクトル> の#define INF 0x3f3f3f3f 使用 名前空間STDを、 typedefの長い 長いLL。 const int型 INF = 0x3f3f3f3f 。 const int型 MAXN = 1E5 + 10 。 構造体ノード { W、D、T LL。 ノード(W LL = 0、LL D = 0、LL T =0 ):W(W)、D(D)、T(t)は{} ブール 演算子 <(constのノード&A)のconst { 場合(広告== d)に戻り AW> W。 リターン広告> D; } }。 INT のmain(){ int型のn; scanf関数(" %のD "、&N) PRIORITY_QUEUE <ノード> QUE。 以下のために(int型 i = 1 ; iが++; iが<= N ) { 、D W LL。 scanf関数(" %LLD%LLD"、&W&D); que.push(ノード(D、W、0 )); } LL日 = 0、ANS = 0 ; ながら(!que.empty()) { ノードE = que.top() ; que.pop(); LL NUM = EW - (日- ET)* ED; 場合(NUM <= 0)続行; 場合(NUM < ED){ W LL = NUM、D = NUM、Tは= 日; QUE .push(ノード(W、D、T)); 続けます; } ANS+ = NUM。 日 ++ ; } のprintf(" %LLDする\ n " 、ANS)。 リターン 0 ; }