25行5-7の演習AC--印刷キュー(プリンタキュー、UVA 12100) - レポートを解決

効率的な発現を行うためにいくつかのコードのようにインスピレーション。


トピック(提出)リンク→ UVA-12100


件名の説明:

我々は、プリンタの印刷ジョブを使用する必要があります。各タスクは、優先度〜9、優先順位の高い、より緊急のタスクを持っています。
:プリンタが動作するプリントキュー Jよりも緊急の課題がある場合は、キュー、タスクjのうち尾に直接印刷キューにjを、そうでない場合は、印刷ジョブJ。すべての印刷は、1分で消費されますが、場所は調整の時間のかかる作業ではありません

入力:

最初のライン:Nテストケース
二行目:M1(タスク番号)M2(我々の注意の使命は、位置)
優先M1タスク:三行。
...

出力:

我々の注目のタスクの完了後の時間。

例えば:

入力:
11テストケース
424のタスク、我々が懸念しているタスクは、第三の4つのタスクに位置している(0から始まる)
の優先12344のタスク
分析:
1、タスクチームヘッド1か最も高い優先度でキュー(1,2,3,4)?いいえ、それはキューの最後に移動します。このキューである:2341、常に0
2 2タスクチームのヘッドキュー(2,3,4,1)か、最優先で?いいえ、それはキューの最後に移動します。このキューである:3412、常に0
3 3タスクチームのヘッドキュー(3,4,1,2)か、最優先で?いいえ、それはキューの最後に移動します。このキューである:4123、時間が0で
最も高い優先度でタスクチームのヘッドキュー(4,1,2,3)か4、4?印刷ジョブ4という。このキューでは次のようになります。123、時間を0から1に
5 1タスクチームのヘッドキュー(1,2,3)かどうかを最優先に?いいえ、それはキューの最後に移動します。このキューである:231、時間が1で
最も優先度の高いタスクチームのヘッドキュー(2,3,1)か6 2?いいえ、それはキューの最後に移動します。このキューである:312、時間が1で
最も優先度の高いタスクチームのヘッドキュー(3,1,2)か7 3?印刷ジョブ3という。時間1から2へ。
出力2の分析終了します。


質問の意味を理解し、次のアイデアを検討してください。

アイデア:

最初のアイデア:
キューにM1のタスクは、キューが最大の優先マックスを検索します。このタスクの優先度<マックス、そしてチーム(尾)場合、デキュー。チームは、T ++:等しい、とされていない場合、我々はタスクに焦点を当てています。
等しい場合は、私たちのタスクが関係していると、T ++、出力T. サイクルの終わり。
私たちは、操作の実装にいくつかの困難が見つかりました:
難しい1:印刷ジョブを決定する方法は、我々の注目の作業ですか?
回避策:タスクの優先度、プラス20,000マークされている場合+10000それぞれの優先順位は、あります。別の裁判官が引き継ぐ前に、優先順位の中で何かをします。以下のような:= 10005%万20005%万。このメソッドが呼び出されたカスタムラベル。
難易度2:オリジナルのアイデアは、最大で入力変数で最も優先度の高いタスクを保存することでしたが、ジョブが印刷されている場合、最大の変化は、どのようにキューに現在最も優先度の高いタスクを見つけるには?
ソリューション:降順プライオリティキュー(priority_queue<int>Max)ストレージの優先順位、再びチームに、印刷されたときに最も高い優先度のタスク。
最終的な思考:
M1の優先度のタスクは、標識後行うキューQ(にqueue<int>qなり、)マークしていない最大に下降するプライオリティキューの優先順位を(priority_queue<int>Max)。qが優先%10000 = Max.top(IF)、優先%10000 <Max.top()場合、エンキュー(尾)、デキュー、および<20000、qは、MaxがデキューT ++をデキュー。 >2万場合、Tは、ループ終了出力されます。

コード:

#include<bits/stdc++.h>
using namespace std;
int main() {
	int n;  cin >> n; while(n--) {
		int m1, m2; cin >> m1 >> m2;			//任务数和关注的任务所在位置
		int T = 0;								//队列中最大的优先级、时刻 
		queue<int>q;							//主队列 
		priority_queue<int>Max;					//降序优先队列,存储优先级 
		for(int i = 0; i < m1; i++)  { 
			int x; cin>>x; 
			Max.push(x);						//压入优先级(Max 中是原本优先级的数)
			i == m2 ? x+=20000 : x+= 10000;		//将关注任务的优先级做标记 
			q.push(x); 							//任务入队 
		}
		while(1) {
			int x = q.front(); 
			q.pop();
			if((x%10000) < Max.top()) { q.push(x); }						//若不是当前最高优先级,则回队尾 
			else 	
				if(x >= 20000) { T++; cout << T << endl; break;}			//若是,且为关注的任务,则输出,结束循环。 
				else { Max.pop(); T++; }									//若不是关注的任务,则T++, Max出队,q出队,T++ 		
		}
	} 
	return 0;
} 

収穫:

1、何のキューイテレータが存在しないことを知っています。(DoがO(╯□╰)O私を笑っていない)
2、カスタムラベルマーク


イベントのすべての興奮の後に苦いとセキュリティ、および音楽を行うことを選択したが、仮想現実よりもリアルオプション。

公開された84元の記事 ウォン称賛78 ビュー9265

おすすめ

転載: blog.csdn.net/weixin_43899069/article/details/104797219