ZOJ 2724 Windows 消息队列 (优先队列)

时间:2014-05-11 20:31:56   收藏:0   阅读:796

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2724

Message queue is the basic fundamental of windows system. For each process, the system maintains a message queue. If something happens to this process, such as mouse click, text change, the system will add a message to the queue. Meanwhile, the process will do a loop for getting message from the queue according to the priority value if it is not empty. Note that the less priority value means the higher priority. In this problem, you are asked to simulate the message queue for putting messages to and getting message from the message queue.

Input

There‘s only one test case in the input. Each line is a command, "GET" or "PUT", which means getting message or putting message. If the command is "PUT", there‘re one string means the message name and two integer means the parameter and priority followed by. There will be at most 60000 command. Note that one message can appear twice or more and if two messages have the same priority, the one comes first will be processed first.(i.e., FIFO for the same priority.) Process to the end-of-file.

Output

For each "GET" command, output the command getting from the message queue with the name and parameter in one line. If there‘s no message in the queue, output "EMPTY QUEUE!". There‘s no output for "PUT" command.

Sample Input

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

Sample Output

EMPTY QUEUE!
msg2 10
msg1 10
EMPTY QUEUE!

翻译:	消息队列是Windows操作系统的基石,对于每一个进程,系统维持了一个消息队列,如果一个进程发生了某一事件,如单击鼠标,文本改变,系统将增加一个消息到队列里,同时,如果队列里不是空的,那么,进程将一直循环的从队列里按优先值抓取消息,注意,数值小意味着高的优先级,在本题中,要求你模拟消息队列,把消息放到消息队列中,或从消息队列里抓取消息;
输入描述:
只有一个测试案例,每行是一条命令,“GET”或“PUT”表示从消息队列里抓取消息或把消息放入消息队列。如果是“PUT”命令,后面跟着一个字符串(表示消息名称)和两个整数(分别表示消息的参数和优先级),案例中的命令最多达60000条,注意,一条命令可以重复出现多次,如果两条命令的优先级相同,则先进入消息队列的那条先被处理;一直处理到文件结尾;
输出描述:对于每条“GET”指令,直接输出他抓取的消息的名称和参数在一行上,如果消息队列是空的,那么直接输出“EMPTY QUEUE!”,对于“PUT”指令,不需要输出什么;

解题思路:
本题是模拟Windows处理消息队列,很有意义,解题中主要遇到的问题是超时错误,根据本题的特点,宜使用优先队列容器来实现;
另外,光是用优先队列容器还不行,必须采用scanf和printf输入输出,否则还会超时,因为本题的数据量大,多达60000行字符串需要处理,需要输入输出;

代码:
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstdlib>
#include <cstring>
using namespace std;

struct Message {  //这里不要用typedef了,因为重载运算符参数类型Message不能识别;
    char Name[200];
    int data, priority;

    bool operator < (const Message a) const  //重载 < 运算符自定义排序准则;
    {
        return a.priority < priority;
    }
};

int main()
{
    priority_queue <Message> v; //定义一个优先队列的对象;
    char command[200];

    while(~scanf("%s", command)) {  //输入命令;
        Message message;
        if(strcmp(command, "GET") == 0) {
            if(v.size() == 0) {      //队列为空;
                printf("EMPTY QUEUE!\n");  //使用cout<<"EMPTY QUEUE"<<endl;不会超时;
            }else {
                printf("%s %d\n", v.top().Name, v.top().data); //使用cout<<v.top().Name<<v.top().data会超时;
                v.pop();    //出队列操作,即将当前消息清除;
            }
        }else if(strcmp(command, "PUT") == 0) {
            scanf("%s %d %d", message.Name, &message.data, &message.priority);
            v.push(message);   //入列;
        }
    }
    return 0;
}



ZOJ 2724 Windows 消息队列 (优先队列),布布扣,bubuko.com

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!