CF854C計画プライオリティキュー|セット

C.計画

ポータル

ヘレンはメトロポリスの空港で動作します。彼女は出発のスケジュールを作成する責任があります。あり  n個の  今日を出発しなければならない便は、  私の彼らの目はに出発する予定です  の日の番目の分。

メトロポリスの空港はMetropoliaの主要交通機関のハブであるので、そのままスケジュールを維持することは困難です。これはまさに今日のケースである。なぜなら、技術的な問題のため、何の便は、最初の時に出発できなかった  k個の  日の分、今、新たな出発スケジュールを作成する必要があります。

すべての  n個の  定期便は今の間で異なる分に出発しなければならない  K  + 1)番目と  K  +  N)番目の、包括的。新しいスケジュールで自分の順番が異なる場合があります-便は、彼らが最初にそうするようにスケジュールされたのと同じ順序で出発するためにしかし、それは必須ではありません。唯一つの制限があります:何の飛行は、それが最初のスケジュールで出発することになっていたよりも早く出発することは許されません。

ヘレンはの遅延の各分ということを知っている  番目のフライトは、空港コスト  C I  burlesを。フライトは、空港の総コストを最小限に抑える新しいスケジュールに出発するために彼女が注文を見つけます。

入力

最初の行は二つの整数が含ま  N  と  K  (1つの≤  k個の  ≤を  n個  300 000≤)、ここで  nは  フライトの数であり、  kは  便が出発しなかったことを一日の始まりの分数です。

2行目は含まれて  、n個の  整数  C 1、  C 2、···、  C N  (1個の≤  C iは  ≦10 ここで、7)  cのiは  遅延のコストであり、  I 1分間目飛行。

出力

最初の行便を遅らせる可能な最小総コストが含まれている必要があります。

第二行は含まれている必要があり  、N  異なる整数  、T 1、  T 2、...、  T N  (K  + 1≤  T iは  ≤  K  +  Nが)、ここで  tはiが  微小である  I番目の飛行出発しなければなりません。いくつかの最適なスケジュールがある場合は、それらのいずれかを印刷します。

入力
コピー
5 2 
4 2 1 10 2
出力
コピー
20 
3 6 7 4 5
注意

私たちは、サンプルテストを考えてみましょう。ヘレンは、ちょうどすべてのフライト移動した場合  2分後に順序を維持し、フライトを遅延させるの総コストは次のようになり  (3 - 1)・4 +(4 - 2)・2 +(5から3)・1 +(6 - 4 )・10 +(7から5)・2 = 38 burles。

しかし、より良いスケジュールは、サンプル回答で示され、そのコストは  (3 - 1)・4 +(6 - 2)・2 +(7 - 3)・1 +(4 - 4)×10 +( - 5 5)・2 = 20burles。

 

質問の意味:そこn個のプレーン、1〜Nが続く元の出発時刻、k個分前であるが、離陸することはできません、1分あたりの最初の知られている航空機の遅延、私はCIとして過ごす、以前の予定より離陸することはできませんが、各フレームを尋ねました最初の飛行機の中で少なくとも数分を過ごすために離陸しました。

ソリューション:彼らは内部のプライオリティキューに離陸できる航空機の最初の数秒で以前の予定より、私たち最初のk + Iを脱ぐことができないので、その後、分を費やしたり手配するために彼を比較し、同じ時間の前に高いポップアップを過ごします離陸するための時間。(また集合と(セット)をソートするために使用されます)

コード:

#include <ビット/ STDC ++ H>
 の#defineは長い長いllの
 使用 名前空間STDを、
CONSTの INT N = 3E5 + 10 構造体ノード{
     int型のID、C。
    ブール 演算子 <(constのノード&X)のconst {
         場合(C == XC)戻り ID < x.id。
        リターン C < XC。
    } 
} [N]、X; 
INTのANS [N]。
INT のmain(){
     int型N、K。
    scanf関数(" %d個の%のD "、&​​N、&K)。
    以下のためにint型 i = 1 ; iが<= N; iが++ ){ 
        scanf関数(" %dを"[I] .C)。
        [I] .ID = iは、
    } 
    LL和 = 0 
    PRIORITY_QUEUE <ノード> Q。
    以下のためにint型 i = 1 ; iは= Kを<I ++はq.push([i])とします)。
    以下のためにint型 I = K + 1、iが<= K + N; I ++ ){
         場合(iは= < q.push n)を([I])。
        X =q.top(); 
        q.pop(); 
        合計 + =μlの*(ix.id)* XC; 
        ANS [x.id] = I。
    } 
    のprintf(" %LLDする\ n " 、合計)。
    以下のためにint型 i = 1 ; iが<= N; iは++ 
        のprintf(" %d個の%のC "、ANS [i]は、I == N?' \ n ''  ' )。
    リターン 0 ; 
}
プライオリティキュー
#include <ビット/ STDC ++ H>
 の#defineは長い長いllの
 使用 名前空間STDを、
CONSTの INT N = 3E5 + 10 構造体ノード{
     int型のID、C。
} [N]、X; 
BOOL CMP(ノードI、ノードj){
     場合(IC == JC)を返す i.id> j.id。
    返す IC> JCを。
} 
INT ANS [N]。
設定 < 整数 > 秒;
INT のmain(){
     int型N、K。
    scanf関数(" %d個の%のD "、&​​N&K)。
    以下のためにint型 i = 1 ; iが<= N; iが++ ){ 
        scanf関数(" %dを"[I] .C)。
        [I] .ID = iは、
        s.insert(I + K)。
    } 
    ソート(A + 1、A + N + 1 、CMP)。
    LL合計 = 0 ;
    以下のためにint型 i = 1 ; iが<= N; iは++ ){
         int型のx = * s.lower_bound([I] .ID)。 + = 1LL *(XA [I] .ID)* [I] .C。
        ANS [[I] .ID]= X。
        s.erase(X)。
    } 
    のprintf(" %LLDする\ n " 、合計)。
    以下のためにint型 i = 1 ; iが<= N; iは++ 
        のprintf(" %d個の%のC "、ANS [i]は、I == N?' \ n ''  ' )。
    リターン 0 ; 
}
セット

 

 

おすすめ

転載: www.cnblogs.com/l999q/p/11333066.html