Codeforces 913C:パーティーレモネード(貪欲)

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つの状態が存在することになります。

  1. すべての購入L以上の数になるまで、ドリンクの安いようなものを買います
  2. 格安は、可能な限りの飲み物を買うが、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 }     
      

 

おすすめ

転載: www.cnblogs.com/Friends-A/p/11373141.html