7.27 练习题

C题 HDU1873看病要排队

7
IN 1 1
IN 1 2
OUT 1          2
OUT 2          empty
IN 2 1
OUT 2          3
OUT 1          1
2
IN 1 1
OUT 1          1
AC code
//优先队列,结构体排序,分别建立 3 个医生的队列,先按优先级排序,
//优先级相等的情况下按病人的顺序排序
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{
	int num ,p;//p优先级 ,num进入的先后 
	bool friend operator < (node a,node b)		//优先队列的重载(重载小于号,使之可以比较结构体大小)
	{
		if(a.p!=b.p)				//优先级不同,优先级高的先进 
			return a.p<b.p;
		else						//优先级相同,比较时间,先到的,先进 
			return a.num>b.num;		
	}	
}pr;
int main()
{
	int n;
	int ant;
	char op[4];//存in 或 out 
	int a,b;		//a医生,b病人优先级 
	while(~scanf("%d",&n))
	{
		ant=0;
		priority_queue<node> q[4];	//优先队列:定义为结构体类型还要用到上面的num,p 
		while(n--)
		{
			scanf("%s",op);
			if(op[0]=='I')
			{
				scanf("%d %d",&a,&b);
				pr.num=++ant;			//ant计数,赋值给num 
				pr.p=b;					//优先级给p 
				q[a].push(pr); 			//四个医生,四个优先级q[1],q[2]... 
			} 
			else
			{
				int t;
				scanf("%d",&t);
				if(q[t].empty())		//q[t]为空,则此医生没有病人,输出 empty 
					printf("EMPTY\n");
				else
				{
					pr=q[t].top();		//不是空,取优先级最高的 
					q[t].pop();			//出队列 
					printf("%d\n",pr.num);
				}
			}
		}
	}
	return 0;
}

E题  HDU1702

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1702

分析:遇到Out 输出 出去的数字(栈的顶端或队列的底端) 

4
4 FIFO(先进先出,队列)
IN 1
IN 2
OUT         1
OUT         2
4 FILO(先进后出,栈)
IN 1
IN 2
OUT          2
OUT          1
5 FIFO(先进先出,队列)
IN 1
IN 2
OUT         1
OUT         2
OUT         none
5 FILO(先进后出,栈)
IN 1
IN 2
OUT          2
IN 3
OUT          3

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>//栈 
#include<queue>//队列 
using namespace std;
int main()
{
    int T,i,a,n;
    char f[5],str[1000];                  //f[5]存储FIFO or FILO 

    cin>>T;
    while(T--)
    {
        cin>>n;
        cin>>f;

        if(f[2]=='F')                      //存入队列
        {
            queue<int >que;                //声明存储int型数据的队列 
            for(i=0;i<n;i++)
            {
                cin>>str;
                if(str[0]=='I')
                {
                    cin>>a;
                    que.push(a);           //入队列 
                }
                else
                {
                    if(que.empty())        //队列为空 
                        cout<<"None"<<endl;
                    else                   //队列不为空  
                    {
                        int x=que.front();//查询队列底端元素
                        que.pop();        //最底端元素出队列
                        cout<<x<<endl;
                    }
                }
            }
        }
        else                             //存入栈 
        {
            stack<int >s;                //声明存储int型数据的栈 
            for(i=0;i<n;i++)
            {
                
                cin>>str;

                if(str[0]=='I')
                {
                    cin>>a;
                    s.push(a);              //元素入栈
                }
                else
                {
                    if(s.empty())         //栈为空 
                        cout<<"None"<<endl;
                    else                   //栈不为空 
                    {
                        int x=s.top();     //查询栈顶元素
                        s.pop();           //最顶端元素出栈
                        cout<<x<<endl;
                    }
                }
            }
        }
    }

    return 0;
}

F题

问题描述

消息队列是windows系统的基本(basic fundamental)。对于每个程序,系统都会有一个消息队列。如果这个程序被操作,比如鼠标点击,文本(text)修改,系统将会给队列发送消息。与此同时,在非空的情况下,程序将会根据优先级值(priority value)从队列中不断得到消息。注意,优先级值越低表示的优先级越高。在这个问题中,你要模仿接收消息和发送消息的队列。

输入

输入项中只有一种情况。每一行是一个指令,接受或发送,即接收消息和发送消息。如果指令是发送,则会有一个表示消息名称的字符串还有两个整数,一个表示参数(parameter),一个表示优先权(priority)最多会有60000条指令。注意,一条消息能够出现两次或者更多,如果两条消息具有同样的优先权,那么先接收的那条将被执行(IE,FIFO都是这样的)。直至文件结束。

输出

对于每条接受指令(GET),从消息队列中输出一行消息名和参数。如果在队列中没有消息,那么输出"EMPTY QUEUE!"(空队列)。对于接受指令则没有输出。

猜你喜欢

转载自blog.csdn.net/tingtingyuan/article/details/81232067
今日推荐