FZU1894 志愿者选拔

Problem Description

世博会马上就要开幕了,福州大学组织了一次志愿者选拔活动。
参加志愿者选拔的同学们排队接受面试官们的面试。参加面试的同学们按照先来先面试并且先结束的原则接受面试官们的考查。
面试中每个人的人品是主要考查对象之一。(提高人品的方法有扶老奶奶过街,不闯红灯等)
作为主面试官的John想知道当前正在接受面试的同学队伍中人品值最高的是多少。于是他请你帮忙编写一个程序来计算。

 Input

输入数据第一行为一整数T,表示有T组输入数据。每组数据第一行为”START”,表示面试开始
接下来的数据中有三种情况:
  输入 含义
1 C NAME RP_VALUE 名字为NAME的人品值为RP_VALUE的同学加入面试队伍。(名字长度不大于5,0 <= RP_VALUE <= 1,000,000,000)
2 G 排在面试队伍最前面的同学面试结束离开考场。
3 Q 主面试官John想知道当前正在接受面试的队伍中人品最高的值是多少。
最后一行为”END”,表示所有的面试结束,面试的同学们可以依次离开了。
所有参加面试的同学总人数不超过1,000,000

 Output

对于每个询问Q,输出当前正在接受面试的队伍中人品最高的值,如果当前没有人正在接受面试则输出-1。

 

Sample Input

2
START
C Tiny 1000000000
C Lina 0
Q
G
Q
END
START
Q
C ccQ 200
C cxw 100
Q
G
Q
C wzc 500
Q
END

 Sample Output

1000000000
0
-1
200
100
500

这题一开始用普通队列做,每次比较一次,发现数据是1000000的,T了。。然后改用单调队列做,A了。每次出队和进队要记录它的时间。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<map>
#include<string>
using namespace std;
char s[10],s1[10],s2[10];
int q[1111111][2];
int main()
{
	int T,n,m,i,j,front,rear,time,a,num;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%s",s);
		front=1;rear=0;num=0;time=0;
		while(1)
		{
			scanf("%s",s1);
			if(strcmp(s1,"END")==0)break;
			if(s1[0]=='C'){
				scanf("%s%d",s2,&a);
				num++;
				while(front<=rear && q[rear][0]<=a){
					rear--;
				}
				rear++;
				q[rear][0]=a;q[rear][1]=num;
			}
			else if(s1[0]=='Q'){
				if(front>rear)printf("-1\n");
				else printf("%d\n",q[front][0]);
			}
			else if(s1[0]=='G'){
				if(front>rear)continue;
				time++;
				while(front<=rear && q[front][1]<=time)front++;
				//if(q[front][1]<=time)front++;
			}
		}
	}
	return 0;
}
posted @ 2015-05-15 16:39  Herumw  阅读(146)  评论(0编辑  收藏  举报