ACM解題之(ZOJ 2724)Windows Message Queue

題目來源

點擊打開鏈接

題目翻譯

消息隊列是windows系統的基本基礎。對於每個進程,系統都維護一個消息隊列。如果這個過程發生某些事情,例如鼠標點擊,文本改變,系統會向隊列添加一條消息。同時,如果不是空的,該過程將根據優先級值從隊列中獲取消息。請注意,優先級越低意味着優先級越高。在這個問題中,系統會要求您模擬消息隊列,以便將消息放入消息隊列並從中獲取消息

輸入:
輸入中只有一個測試用例。每行是一條命令,“GET”或“PUT”,意思是獲取消息或放置消息。如果命令是“PUT”,則有一個字符串表示消息名稱,兩個整數表示參數和優先級。最多會有60000個命令。請注意,一條消息可能出現兩次或更多,如果兩條消息具有相同的優先級,則首先要求處理的消息將先被處理。處理結束文件。

輸出:對於每個“GET”命令,輸出從消息隊列中獲取的命令,其名稱和參數在一行中。如果隊列中沒有消息,請輸出“EMPTY QUEUE!”。 “PUT”命令沒有輸出。

例子:

(輸入)

GET
PUT msg1 10 5
PUT msg2 10 4
GET
GET
GET

(輸出)

EMPTY QUEUE!

msg2 10

msg1 10

EMPTY QUEUE!

解題:

我的思路是,定義一個信息結構,每個信息點包括信息的名字、信息的參數、信息的優先級以及信息的請求順序。

加上信息的請求順序主要是爲了區別同一優先級的信息的先後處理順序。然後把信息點放到一個優先隊列中,優

先隊列的先後順序爲:優先級越低越重要,同一優先級的話,信息請求順序越前越重要。遇到put就進隊列,遇

get,就判斷隊列是否爲空,若不空則出隊輸出,若空就打印爲空。具體看代碼:

/*
c++/accepted
*/

#include<iostream>  
#include<queue>
#include<string>
using namespace std;

struct node {  //定義信息點結構
	int n, p, num;  //n爲參數,p爲優先級,num爲輸入順序
	string s;     
	bool friend operator < (node a, node b) { //定義信息點的大小函數
		if (a.p == b.p)   //優先級相等,就比較輸入順序
			return a.n > b.n;
		return a.p > b.p;  //優先級不等,就比較優先級
	}
}an;
int main() {
	string ss;
	priority_queue<node> q;
	int k = 1;
	while (cin>>ss) {
		if (ss[0] == 'G') { //爲get則拿信息
			if (q.empty()) {//判斷隊列是否爲空
				cout<<"EMPTY QUEUE!"<<endl;
			}
			else {
				an = q.top();
				cout << an.s << " " << an.num << endl; 
				q.pop();
			}
		}
		else { //存信息
			cin >> an.s;
			cin >> an.num;
			cin >> an.p;
			an.n = k;
			k++;
			q.push(an);
		}
	}
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章