codeforces 1282B2。ワン(ハード版)の価格のためのK(DP)

リンクhttps://codeforces.com/contest/1282/problem/B2

タイトルの意味:何かを買いに店、店が持っているn個の項目、各項目は、独自の価格を持って、店はあなたが限られたお金を求めている唯一のもので最も高価を支払うことができる何かを、kは正確に買う特別オファーを持っています使用可能なアイテムの最大数は、あなたが複数の割引を使用することができます。

アイデア:すべてのアイテムの価格が再び小から大にソートされ、i番目のアイテムの価格が[i]は、合計[iは設定 ] あなたが費やしたお金を購入する前に示すi番目の項目、および接頭辞として。i番目の記事では、あなただけの金額を支払う必要があるときときにあなたが買う見つけることができます[IK] + [I ]は、 することができ、あなたは現在の記事を買っているので、K-1を提示することができ、それはあまり直接よりも貪欲にありK-1 Geは直接の項目を寄付する前にアイテムの現在の価格と同額にのみ、[i]は、コスト、支払うものの和[IK]プロセス全体守るために支払う必要がSUM [ I ] = SUMを[ IK ] + A [ I ]へ。

ACコード:

1の#include <iostreamの>
 2の#include < ストリング >
 3の#include <ベクトル>
 4の#include <CStringの>
 5の#include <cstdioを>
 6の#include <アルゴリズム>
 7  使って 名前空間STDを、
8 typedefの長い 長いLL。
9 LL MOD = 1E9 + 7 10  CONST  INT MAXN = 2E5 + 10 11  INT メイン(){
 12      のint Q; CIN >> Q。
13      一方(q-- ){
 14         LL N、P、K、CIN >> N >> P >> K。
15          LLのA [MAXN]。
16          A [ 0 ] = 0 ;
17          のためにINT iは= 1 ; iが<= N; I ++)CIN >> [I]。
18          ソート(+ 1、+ N + 1 )。
19          LL ANS = 0 20          // 2 3 4 5 7 
21          LL和[N + 1 ]。
22          のmemset(和、0はsizeof (合計))。
23          和[ 0 ] = 0;
 24          SUM [ 1 ] = A [ 1。;]
 25          INT I = 2 ; I <= K; I ++ ){
 26である              SUM [I] = SUM [I- 1 ] + A [I]; // 最初のk商品価格は現時点ではクーポンが存在しない、カウントされなければならない
27          }
 28          のためにINT IがK =; I <= N; I ++ ){
 29              [I] = [IK] + SUM SUM A [I];
 30          }
 31である         ためINT I = 0 ; I <= N; I ++ ){
 32              IF(P> = SUM [I])= ANS私 ;
33          }
 34          COUT << ANS << ENDL。
35      }
 36      リターン 0 37 }

おすすめ

転載: www.cnblogs.com/AaronChang/p/12130153.html