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

链接: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

时间: 2024-12-25 17:35:49

ZOJ 2724 Windows 消息队列 (优先队列)的相关文章

ZOJ 2724 Windows Message Queue

A - Windows Message Queue(10.2.1)) Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Description Message queue is the basic fundamental of windows system. For each process, the system ma

Windows消息队列

一 Windows中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个"消息队列",即应用程序队列,用来存放该程序可能 创建的各种窗口的消息.应用程序中含有一段称作"消息循环"的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中.  二 Windows为当前执行的每个Windows程序维护一个「消息队列」.在发生输入事件之后,Windows将事件转换为一个「消息」并将消息放入程序的消息队列中.程序通过执行一块称之为「消息循

细说UI线程和Windows消息队列

在 Windows应用程序中,窗体是由一种称为" UI线程( User Interface Thread)"的特殊类型的线程创建的. 首先, UI线程是一种"线程",所以它具有一个线程应该具有的所有特征,比如有一个线程函数和一个线程 ID. 其次," UI线程"又是"特殊"的,这是因为 UI线程的线程函数中会创建一种特殊的对象--窗体,同时,还一并负责创建窗体上的各种控件. 窗体和控件大家都很熟悉了,这些对象具有接收用户操作的

zoj 2724 Windows Message Queue(使用priority_queue容器模拟消息队列)

题目链接: 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,

windows 消息队列

许多朋友都不会使用MSDN LIBRARY(虽然MSDN 跟 MSDN LIBRARY 不是一回事,但是下文中还是简写为MSDN),其实它是非常重要的东西. 其实所有的说明都可以在MSDN中查到. 环境:VS2008 + SP1补丁    MSDN LIBRARY 2008 + SP1 补丁 打开 这个版本的 MSDN 后,可以看到如图的界面 在最左下角,我们可以看到  Contents .Index .Help Favorites 等选项卡,较为重要的就是 Contents 和 Index ,

Windows消息队列学习笔记

1.windows消息和消息结构 一条消息是作为一个结构传递给应用程序的,这个结构中,包含了消息号,消息的类型,字参数和长字参数等信息.结构定义如下: typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG; 第一个成员变量hwnd表示消息所属的窗口.在Windows程序中,用HWND类型的变量来标识窗口. 第二个成员变量message指定

使用windows消息队列MessageQueue

Config中appSettings配置: <--本地消息队列时 value=".\PRIVATE$\MgrApiRequest"/>--> <add key="RequestQueueName" value="FormatName:Direct=TCP:192.168.100.102\PRIVATE$\MgrApiRequest" /> 消息队列连接,将order类资料加入消息队列中: MessageQueue m

Windows消息队列一

系统消息--ID范围 0-0x03FF 由系统定义好的小哦啊拍下哦,可以在程序中直接使用. 用户自定义消息--ID范围0x0400-0x7FFF 由用户自己定义,满足用户自己的需求.由用户自己发出消息,并相应处理 自定义消息宏:WM_USER 应用程序消息--ID范围0x8000-0xBFFF 程序之间通讯时使用的消息. 应用程序消息宏:WM_APP 系统注册消息--ID范围0xC000-0XFFFFF 在系统注册并生成相应消息,然后可以在各个程序中使用这个消息.

7-20 Windows消息队列 (25 分)(模拟水题)

题意: ? 思路: 用优先队列直接模拟就OK了,另外优先队列存pair的时候比较的是first的值,实测!! ? 上代码: 1 #include <iostream> 2 #include <queue> 3 #include <cstdio> 4 #include <algorithm> 5 #include <cmath> 6 #include <cstring> 7 #include <queue> 8 #inclu