C.パーティーレモネード
新年のパーティーはレモネードずに新年のパーティーではありません!いつものように、あなたはゲストの多くを期待している、とレモネードを購入することは、すでに楽しい必需品となっています。
あなたのお気に入りの店はのボトルでレモネードを販売している n個 の異なるコストで異なるボリューム。タイプの単一ボトル iが 体積有する 2 I-1 リットルのコスト- C I ルーブル。店舗内の各タイプのボトルの数は無限大と考えることができます。
あなたは、少なくとも購入したい Lの レモネードのリットル。どのように多くのルーブルあなたが費やす必要はありますか?
入力
最初の行は2つの整数を含んでいる N と L (1≤ N 、30≤ 1≤の L 10≤ 9 それぞれストア内のボトルの種類の数とリットルレモネードの必要量を、 - )。
2行目は含まれて 、n個の 整数 C 1、 C 2、···、 C N (1個の≤ C iは ≦10 9の異なるタイプのボトルのコスト- )。
出力
出力単一の整数-あなたは、少なくとも購入するために支払う必要はルーブルの最小数 Lの レモネードのリットル。
例
4 12
20 30 70 90
150
3 4
10000 1000 100 10
10
3 4
10 100 1000 10000
30
5 787787787
123456789 234567890 345678901 456789012 987654321
44981600785557577
注意
最初の例では、90ルーブル、30ルーブルごとに、2つの2リットルボトル用1 8リットルのボトルを購入する必要があります。合計では、わずか150ルーブルのためにレモネードの12リットルを得るでしょう。
2番目の例では、あなただけの3リットルが必要にもかかわらず、それは10ルーブルのための単一の8リットルのボトルを購入するより安いです。
第三の例では、30ルーブルのために3リットルを得て、10ルーブル各3 1リットルのボトルを購入するのが最善です。
問題の意味
飲料、2の容量のn個の異なるサイズがありI.の1-各飲料の価格与えられたLは、。
今主題は、それがコスト、少なくともどのくらい、飲料の少なくともリットルリットルを購入する必要があります。
考え
よく見ると、貪欲タイトルSBのように見え、再読み込み質問、それはバックパックだと思いました
それだけではなく、常に比較されている2つの状態のそれぞれに貪欲、最も安い貪欲であるので、しかし、貪欲と少しDP感は、2つの状態の間の切り替え
最初の(リットル当たりどのくらいの)各飲料の単価に応じて降順に、そして2つの状態が存在することになります。
- すべての購入L以上の数になるまで、ドリンクの安いようなものを買います
- 格安は、可能な限りの飲み物を買うが、Lを超えない、Lは、最初のステップとして、残りを返します
コード
1つの#include <ビット/ STDC ++ H> 2 の#defineっ長い長い 3つ の#define ULLのunsigned long長い 4つ の#define MS(B)のmemset(A、B、はsizeof(a))は 5 CONST INT INF = 0x3f3f3f3f 。 6 CONST LL INF = 0x3f3f3f3f3f3f3f3f 。 7 のconst int型 MAXN = 1E6 + 10 。 8 のconst int型 MOD = 1E9 + 7 。 9 のconst int型 MAXM = 1E3 + 10 。 10 使って 名前空間はstdを、 11 構造体wzy 12 { 13 のLL大げさ。 14 LLのお金。 15 、二重価格。 16 } P [MAXN]。 17 ブールCMP(wzy U、wzy V) 18 { 19 リターン u.price < v.price。 20 } 21 int型のmain(int型 ARGC、チャー CONST * ARGV []) 22 { 23 #ifndefのONLINE_JUDGE 24 freopenは(" /home/wzy/in.txt "、「R"STDIN); 25 freopenは(" /home/wzy/out.txt " " W 」、STDOUT); 26 にsrand((符号なし整数)時間(NULL)); 27 #endifの 28 IOS :: sync_with_stdio(偽) ; 29 cin.tie(0 ); 30 INT N、 31 LL 1; 32 CIN >> N >> L; 33 用の(int型 i = 1 ; iが<= N; iが++ ) 34 { 35 CIN >>P [i]は.money。 36 P [i]は.bigness =(1LL <<(I- 1 ))。 37 P [i]は.price = 1.0 *のP [I] .money / P [i]は.bigness。 38 } 39 ソート(P + 1、P + 1 + N、CMP)。 40 LLのL = L。 41 LL ANS = INF。 42 LL RES1 = 0、RES2 = 0 。 43 一方(L> 0 ) 44 { 45 のための(int型 i = 1 ; iが<= N; iが++ ) 46 { 47 // 購入全ての飲料 48 RES1 RES2 + = CEIL(1.0 *のL / P [I] .bigness)* P [I] .money; 49 = ANS 分(ANS、RES1); 50個の // 余分な部品他の購入 で51 RES2 + = L / P [I] .bigness * ; P [I] .money 52である L - =(P [I] .bigness×(L / P [I] .bigness)); 53はである } 54れます } 55の ANS = 分(ANS、RES2); 56である COUT ANS << << ENDL; 57は #ifndefのONLINE_JUDGE 58 CERR、<< " 経過時間:"<< 1.0 *クロック()/ CLOCKS_PER_SEC << "S " << てendl; 59 #endifの60 の戻り0 ; 61 }