釣りマスター(2019年中国の大学プログラミングコンテスト(CCPC) - ネットワークトライアル)

問題の説明
聞いた  のE Oのmは  釣りMASTERで、あなたのメンターとして彼を認めたいです。誰もが知っているようにあなたがMASTERの弟子になりたい場合は、あなたは裁判を渡す必要があります。あなたは釣りマスターを見つけるときに  電子のOのメートルを、裁判は以下の通りである:

あり  n個の  プールで魚が。以下のために  それの  時間の  魚は、少なくともかかる  T iは  シチュー分(煮過ぎるが許容可能です)。この問題を単純化するために、魚をキャッチ費やした時間がある  のk分。一度に魚1をキャッチすることができますし、唯一のポットがあるので、一つだけの魚は一度に鍋に煮することができます。あなたが魚をキャッチしている間、あなたはポットに巻き込まれている生の魚を置くことができない、それはあなたが魚をキャッチし始めた場合、あなたは後まで止めることができないことを意味する  k個  分。あなたが魚をキャッチしていないとき、あなたは(未満なしのため煮込み調理魚取ることができます  トンの私の鍋の外に)または鍋に生の魚を入れて、これらの2つの操作は時間がかかりません。鍋で煮魚は十分な時間煮込んされていない場合、あなたはそれを取ることができないことに注意してください、しかし、あなたは別の魚を捕まえるために行くか、それが十分に煮込んされるまで、ただ何もしない、しばらく待つことができます。

今  E O メートル 彼は満足のいく食事を持つことができるように、あなたはできるだけ早くすべての魚をキャッチし、シチューたい、(あなたは間違いなく魚だけ十分に煮込んだ後に食べることができることを知っています)。あなたが最短時間でそれを完了することができた場合は、  電子のOのメートルは  彼の弟子としてあなたを受け入れると言って「私が行っています!私はいっぱいです!」。あなたが、できない場合  のE Oのメートルは  あなたを受け入れ、言うことはありません「あなたが行われています!あなたがだますです!」。

ですから、最適な時間を手配した場合に裁判を渡すための最短時間は何ですか?
 

 

入力
入力の最初の行は、単一の整数で構成さ  T 1 T 20 テストケースの数を表します。

各テストケースのために、最初の行は、二つの整数含ま  N 1 N 10 5 K 1 K 10 9 プール内の魚の数と魚を捕まえるために必要な時間を表します。

2行目は含まれ  n個の  整数、  T 1 T 2を... T N 1 ≤のT iは10 9  、調理に必要な最低時間表す I - Tの時間 魚。
 

 

出力
各テストケースのために、試験を通過する最短時間を示す、一列に単一の整数を印刷します。
 

 

サンプル入力
2 3 5 5 5 8 2 4 3 3
 

 

サンプル出力
23 11
ヒント
ケース1:第三の魚(5分)キャッチは、第1回魚を入れ、第三の魚を取り出し、(3分)待って、第一の魚(5分)をキャッチし、第3回魚を入れて(第二魚を捕まえます5分)、)(5分を待って、第二に魚を入れ、第一の魚を取り出し、第二の魚を取ります。ケース2:第一の魚(4分)キャッチは、(3分)待って、第2回魚を入れ、第一の魚を取り出し、第二の魚(4分)をキャッチし、第1回魚を入れて第二の魚を取ります。
 
 
#include <ビット/ STDC ++。H> 
の#include <iostreamの> 
する#include <アルゴリズム> 
の#include <cstdioを> 
する#include < ストリング > 
の#include <CStringの> 
する#include <cstdlib> 
の#include <地図> 
の#include <ベクトル> 
#含める < セット > 
の#include <キュー> 
の#include <スタック> 
の#include <cmath> 
typedefの長い 長いLL。
使用して 名前空間はstdを、
const  int型 INT = 1E6 + 5 LSONのRT << 1、L、M  
 の#define rsonのRT << 1 | 1、M + 1、R用
 の#define読み取る(X)のscanf( "%dの"、およびX)
 の#define LREAD(X)のscanf( "%のLLD "、&バツ);
#define PT(X)のprintf( "%d個の\ n"、(X))
 の#define CN CIN >>
 の#define CT COUT <<
 の#define EN << ENDL
 の#define担当者(J、K)のための式(I = int型(INT)〜(j)は、iが<=(INT)(K); I ++)
 の#define MEM(S、T)のmemset(S、T、はsizeof(複数可))
 の#defineリターン0を再。
LL [ 100000 + 5 ]、B [ 10000 + 5 ]。
PRIORITY_QUEUE <LL> Q1、Q2;

    LLのT、N、K、M。
    // CNトン。
    (t)を読み出します。
    一方、(t-- 
    { 
        // CN N >> K。
        scanf関数(" %のLLDの%のLLD "、&​​N&K)。
        担当者(1、N)LREAD([I])。// CN [i]は、
        ソート(+ 1、A + 1個の + N)。

        以下のためにint型 I = N; I> = 1 ; i-- 
        { 
            場合(!q1.empty())
            { 
                int型のx = q1.top()。
                q1.pop(); 
                もし(X>K)
                    q1.push(X - K)。
            } 
            q1.push([I])。
        } 
        LL和 = N * K。
        一方、(!q1.empty())
        { 
            合計 + = q1.top()。q1.pop(); 
        } 
        のprintf(" %LLDする\ n " 、合計)。
        // CT和エン; 
        
    } 
}

 

おすすめ

転載: www.cnblogs.com/Shallow-dream/p/11415578.html