Descrption
コンピュータサイエンスの学生組合の唯一のプリンタは非常に重い負荷を経験しています。時にはそこ百ジョブがプリンタキューであり、あなたは、出力の1ページを取得するために時間を待つ必要があります。
一部のジョブが他よりも重要であるため、ハッカー一般的には、発明し、印刷ジョブキューのための単純な優先順位システムを実装しました。今、各ジョブ(9が最優先された状態で、1が最低である)1と9の間の優先順位が割り当てられ、次のようにプリンタが動作します。
キューの最初のジョブJがキューから取得されます。
仕事Jよりも優先順位の高いキューにあるいくつかのジョブが存在する場合、それを印刷せずにキューの最後にJを移動します。
それ以外の場合は、印刷ジョブJ(とキューに戻ってそれを入れていません)。
このように、ハッカー全般に印刷され、これらすべての重要なマフィンのレシピは非常に迅速に印刷されます。もちろん、他の人が印刷されているそれらの迷惑な用語の論文はかなりの時間が印刷を取得するのを待つ必要があり、それは人生です。
新しいポリシーを持つあなたの問題は、それがあなたの印刷ジョブが実際に完成予定時期を決定するために、かなりトリッキーになってきているということです。あなたはこれを理解するためにプログラムを書くことにしました。プログラムには、追加のジョブが追加されませんと仮定して、(優先順位のリストのような)現在のキューと同様に、キュー内のジョブの位置が与えられますし、お使いのジョブが印刷されるまで、それはかかる時間を計算しなければなりません。キューに。問題を単純化するために、我々は、ジョブを印刷することは、常に正確に1分かかり、キューからジョブを追加および削除する瞬間であると仮定します。
入力形式
正の整数の一つの行:テストケースの数(最大20)。そして、各テストケースのために:
- nは、キュー内のジョブの数(50≤1≤n)およびM 2つの整数nとmとの1つのライン仕事の位置(0≤Mの≤N -1)です。キュー内の最初の位置は、第二のように数1であり、そして、数0です。
- キュー内のジョブの優先順位を与える1〜9の範囲内の一つlinewith nは整数、。最初の整数は2番目の整数を、第二のジョブの優先度を第一のジョブの優先度を与え、。
出力フォーマット
各テストケースのために、単一の整数と一行を印刷。あなたの仕事までの分の数は、完全には追加の印刷ジョブが到着しないだろうと仮定して、印刷されます。
入力サンプル
3
1 0
5
4 2
1 2 3 4
6 0
1 1 9 1 1 1
出力サンプル
1 2 5
要件:優先順位を使用してみてくださいキュー。この問題の目的は、優先度の運動キューです。この質問のアイデア(プライオリティキューを使用して):双方向キュー(両端キュー)と優先度キュー(プライオリティキュー)、および両端キューから最初の宣言を第1の位置要素の要素、チームの最初の要素と比較して、キューの優先度キューの両端キューヘッドの各要素、前者が後者よりも小さくない場合、(両端キューポップ両方最初の後ろに優先度キュー)、時間++を印刷し、そうでない場合バック両端キューに両端キューキュー要素の頭尾を押すと、最初の位置要素は、印刷、出力時間になるまで。ただし、最初の位置は末尾に要素をプッシュしている場合は最初のチームにそれをポップする、その後、ループ。第deque.sizeの最初の要素() - 1つの要素次のようにコア・コードが実装されています。
用(int型のk = 0 ; kは<=位置あり、k ++ ){ 場合(dq.front()> = pq.top()){ dq.pop_front()。 pq.pop(); 時間 ++ ; } 他{ dq.push_back(dq.front())。 dq.pop_front(); もし(K == 位置){ K = 0 。 位置 = dq.size()。 } } }
DQは両端キューを指し、ここで、pqがプライオリティキューを指し、
しかし、注意すべきいくつかの詳細(レッスンのピット)があります
。1.プリントが0に設定する必要がありますたびに
各ラウンドは、両端キューと優先度キューは空に印刷されます。2.
私は、このようなだったとき、空は書きました:
dq.clear(); 用(int型、E = 0 ; E <pq.size(); E ++ ){ pq.pop()。 }
これは、発見したことがあります。
pq.size後のすべてのpq.popは、()()変更されました!!!!
だから、最初の前例のないpq.sizeをクリアしてください()リサイクル、保存されました
すなわち:
INT TMP = pq.size()。 dq.clear(); 用(INT E = 0 ; E <TMP; E ++ ){ pq.pop()。 }
しかし、私はまだ(大法が良いながら)大法時に使用します
dq.clear(); しばらく(!pq.empty()) pq.pop();
次のように完全なコードは次のとおりです。
書式#include <iostreamの> の#include <キュー> の#include <デック> 使用して 名前空間はstdを、 INT のmain(){ int型のn; int型NUM; int型の位置。 int型の温度; int型の時間= 0 ; 両端キュー < 整数 > DQ。 PRIORITY_QUEUE < 整数 > PQ; cinを >> N; 以下のために(int型 i = 0 ; iがn <; iは++ ){ CIN >> NUM >>ポジション; 用(INT J = 0 ; J <NUM; J ++ ){ CIN >> TEMP。 dq.push_back(TEMP)。 pq.push(TEMP)。 } のための(int型のk = 0 ; kは<=位置あり、k ++ ){ 場合(dq.front()> = pq.top()){ dq.pop_front()。 pq.pop(); 時間 ++ ; } 他{ dq.push_back(dq.front())。 dq.pop_front(); もし(K == 位置){ K = 0 。 位置 = dq.size()。 } } } COUT <<時間<< ENDL。 dq.clear(); しばらく(!pq.empty()) pq.pop(); 時間 = 0 ; } 戻り 0 。 }