您的位置:首页 > 其它

Fuzhou OJ Problem 1894 志愿者选拔

2013-09-11 16:30 281 查看
Fuzhou OJ Problem 1894 志愿者选拔

Time Limit: 1500 mSec    Memory Limit : 32768 KB



 Problem Description

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



 Input

输入数据第一行为一整数T,表示有T组输入数据。每组数据第一行为”START”,表示面试开始
接下来的数据中有三种情况:
 输入含义
1C NAME RP_VALUE名字为NAME的人品值为RP_VALUE的同学加入面试队伍。(名字长度不大于5,0 <= RP_VALUE <= 1,000,000,000)
2G排在面试队伍最前面的同学面试结束离开考场。
3Q主面试官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

10000000000

-1

200

100

500



 Hint

数据较大建议使用scanf,printf 不推荐使用STL



 Source

福州大学第七届程序设计竞赛

/**
单调队列
**/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
#define maxn 1100000
#define Mem(a,x) memset(a,x,sizeof(a))

class Queue//首先自己写一个队列,这样,在main中的内容就不会难看了
{
public:
int val[maxn];
int first;
int last;
Queue()         {first=0;last=0;}//构造函数
bool Empty()    {if(first==last) return 1;return 0;}//判空
int First()     {return val[first];}
int Last()      {return last-1;}//返回最后一个
int Push(int x) {val[last++]=x;return last-1;}//入队
int Pop()       {first++;return first-1;}//出队
void SetEmpty(int x){Mem(val,x);first=last=0;}//置空
}q;

class DeQueue:public Queue//派生一个队列,称为单调队列
{
public:
int Push(Queue &q,int num)//需要重载的进队函数
{
int i=((last-1)<0?0:(last-1));//位置指针
while(q.val[val[i]]<q.val[num])//从后往前找比目标值大的(题目中要求第一个是最大值)
{
if(i==first) break;//如果找到第一个了,再往前就没有了,需要跳出
i--;//继续往前找
}
if(i==first&&q.val[val[i]]<q.val[num])//找到第一个了,如果仍然小,那就将第一个替换
{val[first]=num;last=first+1;}//处理好队列的指针
else
{val[i+1]=num;last=i+2;}//其他情况都是普通情况,
return last-1;//返回最后一个元素的指针
}
}Dq;

int main()
{
//freopen("1.txt","r",stdin);
int T;
scanf("%d",&T);
for(int t=0; t<T; t++)
{
char s[20];
while(~scanf("%s",s))
{
if(strcmp(s,"END")==0) break;//结束
if(strcmp(s,"START")==0)//开始时,需要初始化
{
q.SetEmpty(0);
Dq.SetEmpty(0);
}
if(strcmp(s,"C")==0)//进队
{
int c;
char name[100];
scanf("%s%d",name,&c);
int temp=q.Push(c);
Dq.Push(q,temp);//此时需要更新优先队列
}
else if(strcmp(s,"Q")==0)//查询
{
if(!Dq.Empty())//判空
{
int temp=Dq.First();
printf("%d\n",q.val[temp]);
}
else
printf("-1\n");
}
else if(strcmp(s,"G")==0)//出队
{
int temp=q.Pop();
while(Dq.First()<=temp&&!Dq.Empty())
Dq.Pop();//循环出队
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  单调队列