FZU 1894 志愿者选拔(简单单调队列)

 Problem 1894 志愿者选拔

Accept: 772    Submit: 2529
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想知道当前正在接受面试的队伍中人品最高的值是多少。
最后一行为”END”,表示所有的面试结束,面试的同学们可以依次离开了。
所有参加面试的同学总人数不超过1,000,000

 Output

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

 Sample Input

2STARTC Tiny 1000000000C Lina 0QGQENDSTARTQC ccQ 200C cxw 100QGQC wzc 500QEND

 Sample Output

10000000000-1200100500

 Hint

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

 Source

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

题目: http://acm.fzu.edu.cn/problem.php?pid=1894

题意:一堆人在排队面试,每个人有不同的RP值,每次可能问当前排队的人的最大RP,或者让第一个人离开

分析:这题如果之前做过单调队列,应该是一眼就知道怎么做的了直接边输入边维护,询问就输出,离开就出队

PS:这题我居然wa了4次,我遇到简单题总是这么大意,这个毛病得改改啊,主要是简单的把队列头出队了,其实要判断队列头是否该出队的= =

代码:

#include<cstdio>
#include<iostream>
using namespace std;
const int mm=1111111;
int rp[mm],q[mm];
int main()
{
    int l,r,n,out,t;
    char op[9],name[9];
    scanf("%d",&t);
    while(t--)
    {
        out=n=l=0,r=-1;
        while(scanf("%s",op),op[0]!='E')
        {
            if(op[0]=='C')
            {
                ++n;
                scanf("%s%d",name,&rp[n]);
                while(l<=r&&rp[q[r]]<rp[n])--r;
                q[++r]=n;
            }
            if(op[0]=='Q')
                printf("%d\n",out<n?rp[q[l]]:-1);
            if(op[0]=='G')(++out>=q[l])?++l:l;
        }
    }
    return 0;
}


你可能感兴趣的:(c,面试,活动,input,output)