釣りマスター(思考+貪欲)

トピックのウェブサイト:
http://acm.hdu.edu.cn/showproblem.php?pid=6709


問題の説明


EOMは釣りマスターであることを聞いて、あなたはあなたのメンターとして彼を認めたいです。誰もが知っているようにあなたがMASTERの弟子になりたい場合は、あなたは裁判を渡す必要があります。あなたは釣りMASTERのEOMを見つけるときに、裁判は以下の通りです:
プールで魚をNがあります。私のために - 魚目、それは(煮過ぎるでも可)シチューには、少なくともTI分かかります。この問題を単純化するために、魚をキャッチ費やした時間は、k個分です。一度に魚1をキャッチすることができますし、唯一のポットがあるので、一つだけの魚は一度に鍋に煮することができます。あなたが魚をキャッチしている間、あなたはポットに巻き込まれている生の魚を置くことができない、それはあなたが魚をキャッチし始めた場合、あなたはk個分後まで停止することはできません意味します。あなたが魚をキャッチしていないとき、あなたは鍋の外に(TI未満なしのため煮込み)調理魚を取るか、鍋に生の魚を置くことができ、これらの2つの操作は時間がかかりません。鍋で煮魚は十分な時間煮込んされていない場合、あなたはそれを取ることができないことに注意してください、しかし、あなたは別の魚を捕まえるために行くか、それが十分に煮込んされるまで、ただ何もしない、しばらく待つことができます。
今、EOMは、彼が満足のいく食事を持つことができるように、あなたは、(あなたは間違いなく魚だけ十分に煮込んだ後に食べることができることを知っている)、できるだけ早くすべての魚をキャッチし、シチューたいです。あなたが最短時間でそれを完了することができた場合は、EOMは、彼の弟子としてあなたを受け入れますし、私が行っています」と言います!おなかがいっぱいです!"。あなたは、EOMはあなたを受け入れ、言うことはありませんができない場合は、「あなたはなされています!あなたは馬鹿です!」。
ですから、最適な時間を手配した場合に裁判を渡すための最短時間は何ですか?


入力


入力の最初の行は、単一の整数で構成され
たテストケースの数を表す、T(1≤T≤20)。
各テストケースのために、最初の行は、二つの整数N(1≤n≤1e5)、K(1≤k≤1e9)を含有する
プール中の魚の数と魚を捕まえるために必要な時間を表します。
2行目は、i番目の魚を調理するのに必要な最小時間を表す、nは整数、T1、T2、...、TN(1≤ti≤109)が含まれています。


出力


各テストケースのために、試験を通過する最短時間を示す、一列に単一の整数を印刷します。
サンプル入力
2
3 5
5 5 8
2 4
3 3
サンプル出力
23
11


ヒント


ケース1:第三の魚(5分)キャッチは、(3分)待って、第一の魚(5分)をキャッチし、第3回魚を入れ
、第1回魚を入れ、第三魚を取る(第二魚を捕まえます5分)、
)(5 分を待って、第二に魚を入れ、第一の魚を取り出し、第二の魚を取ります。
ケース2:第二の魚(4分)をキャッチし、第1回魚を入れ、第一の魚(4分)キャッチ
(3分)待って、中に第二の魚を入れ、第一の魚を取り出し、第二の魚を取ります。


N Zhuolaiがキャッチ魚は、魚を調理するがあることが効果の対象には、すべてのk個分が必要ですが、それぞれの魚は、T分を調理し、最速の魚のすべての時間を調理します。
この質問は、私は自閉症のチームメイトと直接始めましょう、という考えがキャッチした魚を調理するのに長い時間を開始することですが、!サンプルを識別するために開始する可能証明とノックアウトし、次いでWA(-5)。その後、反例の外に転覆。最後の8分で交流のアイデアを思い付いたkよりも多くの場合、キャッチさt [i]は/ k個の魚を調理する時、それぞれの魚を調理する時間があり、その後、配列の残りの部分に。私たちは、kの完全な配列未満の時に来ることができるように、(魚の漁獲が終了していない場合は、魚がオフに終了した場合、及び、その後、心の平和のような魚を煮)。この時点では関係なく、料理をキャッチしませんでしたどのように多くの魚それぞれの魚の時に魚をキャッチしてはならないし、すべての魚を捕まえるために行われるまで煮ます。だから、キャッチしていないどのように多くの魚の降順の配列を取得するには、この時点で、合計は、kの数が増加します、プラス魚の調理時間の残りの部分は答えることができます。


コード


#include <ビット/ STDC ++ H.>
使用して名前空間STD;
ロングロングLLのtypedef;
LL SUM;
INT NUM、T、N - 、K、A [100005];
int型CMP(INT A、int型B){戻りA> B。 }
int型のmain(){
 (偽の)IOSの:: sync_with_stdio;
 CIN >> T;
 ながら(T - ){
  CIN >> N-K;
  NUM = 1; //アップ調理魚キャッチする。
  和= Kと、 //最初の魚時間
  {(。; I <= N-I ++はINT I = 1)のための
   CIN >> [I];
   IF(NUM <N-){
    int型X = [I] / K; //現在時刻は、最も多くの沸騰漁獲魚を完了することができる
    (NUM + X> = N){IF
     (N-- - NUM)A [I] = A [I] * K;
     SUM = SUM +(N-- NUM)* K ;
     NUM = N-;
    }そうでなければ{
     SUM = SUM + X * K、
     [I] = A [I]%のK。
     X + NUM = NUM;
    }
   }
  }
  ソート(1 + A、+ N-A + 1、CMP。); //配列のこの時点で数Kので、魚をキャッチする最初のカウント時間、キャッチ魚未満、しかし完全ではありません煮魚良いの心の沸騰平和
  のために(INT I = 1; I <= N - 、Iは++){
   IF(NUM <N-){
    SUM = SUM + K;
    NUM ++;
   }そうでなければ{
    SUMのSUM + [I] =。
   }
  }
  COUT SUM << << ENDL;
 }
 戻り0;
}

おすすめ

転載: www.cnblogs.com/jjmmboom/p/11470233.html