Fuzhou OJ Problem 1894 志愿者选拔
2013-09-11 16:30
281 查看
Fuzhou OJ Problem 1894 志愿者选拔
世博会马上就要开幕了,福州大学组织了一次志愿者选拔活动。
参加志愿者选拔的同学们排队接受面试官们的面试。参加面试的同学们按照先来先面试并且先结束的原则接受面试官们的考查。
面试中每个人的人品是主要考查对象之一。(提高人品的方法有扶老奶奶过街,不闯红灯等)
作为主面试官的John想知道当前正在接受面试的同学队伍中人品值最高的是多少。于是他请你帮忙编写一个程序来计算。
输入数据第一行为一整数T,表示有T组输入数据。每组数据第一行为”START”,表示面试开始
接下来的数据中有三种情况:
最后一行为”END”,表示所有的面试结束,面试的同学们可以依次离开了。
所有参加面试的同学总人数不超过1,000,000
对于每个询问Q,输出当前正在接受面试的队伍中人品最高的值,如果当前没有人正在接受面试则输出-1。
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
10000000000
-1
200
100
500
数据较大建议使用scanf,printf 不推荐使用STL
福州大学第七届程序设计竞赛
Time Limit: 1500 mSec Memory Limit : 32768 KB
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想知道当前正在接受面试的队伍中人品最高的值是多少。 |
所有参加面试的同学总人数不超过1,000,000
Output
对于每个询问Q,输出当前正在接受面试的队伍中人品最高的值,如果当前没有人正在接受面试则输出-1。
Sample Input
2START
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; }
相关文章推荐
- fzoj Problem 1894 志愿者选拔 【单调队列】
- Problem 1894 志愿者选拔
- Problem 1894 志愿者选拔
- FZU 1894 志愿者选拔 (单调队列)
- FZU - 1894选拔志愿者【单调队列】
- FZU1894 志愿者选拔
- fzu 1894 志愿者选拔 单调队列
- FZU - 1894 志愿者选拔 单调队列
- FZU 1894(志愿者选拔-裸的单调队列)
- FZU 1894 — 志愿者选拔 单调队列
- FZU 1894 志愿者选拔
- 暑期训练狂刷系列——Foj 1894 志愿者选拔 (单调队列)
- fzu 1894 志愿者选拔 (单调队列)
- FZUOJ 1894 志愿者选拔
- 【FOJ】1894 志愿者选拔
- fzu 1894 志愿者选拔 单调队列的学习
- FZU 1894 志愿者选拔(单调队列)
- FZU 1894 志愿者选拔[双端队列/单调队列]
- foj Problem 1894 志愿者选拔---单调队列
- FZU1894-志愿者选拔