【UOJ 55】志愿者选拔

【题目描述】:

世博会马上就要开幕了,福州大学组织了一次志愿者选拔活动。

参加志愿者选拔的同学们排队接受面试官们的面试。参加面试的同学们按照先来先面试并且先结束的原则接受面试官们的考查。

面试中每个人的人品是主要考查对象之一。(提高人品的方法有扶老奶奶过街,不闯红灯等)

作为主面试官的John想知道当前正在接受面试的同学队伍中人品值最高的是多少。于是他请你帮忙编写一个程序来计算。

【输入描述】:

输入数据第一行为一整数T,表示有T组输入数据。

每组数据第一行为”START”,表示面试开始

接下来的数据中有三种情况:

C NAME RP_VALUE 名字为NAME的人品值为RP_VALUE的同学加入面试队伍。

G 排在面试队伍最前面的同学面试结束离开考场。

Q 主面试官John想知道当前正在接受面试的队伍中人品最高的值是多少。

最后一行为”END”,表示所有的面试结束,面试的同学们可以依次离开了。

【输出描述】:

对于每个询问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

【样例输出】:

1000000000
0
-1
200
100
500

【时间限制、数据范围及描述】:

时间:1s 空间:64M

30%:操作命令不超过200

60%:操作命令不超过20,000

100%:操作命令不超过200,000

所有参加面试的同学总人数不超过100,000

名字长度不大于5,0 <= RP_VALUE <= 1,000,000,000

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

题解:维护一个单调递减序列,每次询问时输出栈底值即可。

不是很懂,copy别人代码的, 所以注释没删,先完成任务,后面有时间慢慢咀嚼。

#include<stdio.h>
const int N=1e6+5;
char s[10];
int maxx[N],a[N];
int main()
{
    int t,k,head,tail,tot;
    scanf("%d",&t);
    while(t--)
    {
        tot=0,k=0,head=0,tail=-1;//k代表加入队列的人数
        while(scanf("%s",s)&&s[0]!=‘E‘)
        {
            if(s[0]==‘C‘)//加入队列
            {
                scanf("%s%d",s,&a[k]);
                while(head<=tail&&a[k]>a[maxx[tail]]) tail--;
                maxx[++tail]=k++;
            }
            else if(s[0]==‘G‘)//删除队列
            {
                if(maxx[head]==tot) head++;//判断单调递减序列的第一个元素是否是当前要删除的元素,如果是让head++
                tot++;
            }
            else if(s[0]==‘Q‘)
            {
                if(tot==k) printf("-1\n");//如果当前没有人了,输出-1
                else printf("%d\n",a[maxx[head]]);
            }
        }
    }
}

原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11192340.html

时间: 2024-08-29 02:03:43

【UOJ 55】志愿者选拔的相关文章

志愿者选拔(单调队列)

Problem 1894 志愿者选拔 Accept: 1783    Submit: 5564 Time Limit: 1500 mSec    Memory Limit : 32768 KB  Problem Description 世博会马上就要开幕了,福州大学组织了一次志愿者选拔活动.参加志愿者选拔的同学们排队接受面试官们的面试.参加面试的同学们按照先来先面试并且先结束的原则接受面试官们的考查.面试中每个人的人品是主要考查对象之一.(提高人品的方法有扶老奶奶过街,不闯红灯等)作为主面试官的

FZU 1894 志愿者选拔【单调队列】【monotone decreasing queue】

?Problem 1894 志愿者选拔 Accept: 1770????Submit: 5523 Time Limit: 1500 mSec????Memory Limit : 32768 KB ?Problem Description 世博会立即就要开幕了,福州大学组织了一次志愿者选拔活动.參加志愿者选拔的同学们排队接受面试官们的面试.參加面试的同学们依照先来先面试而且先结束的原则接受面试官们的考查.面试中每一个人的人品是主要考查对象之中的一个.(提高人品的方法有扶老奶奶过街,不闯红灯等)作为

志愿者选拔

题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行.为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试.面试分数线根据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试分数线为排名第m*150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手.现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩. 输入 第一行,两个整数n,m(5 ≤ n ≤ 5000,3 ≤ m ≤ n),

FZU 1894 志愿者选拔 单调队列

训练赛的题…… 暴力一波明显超时…… 最近刚学stl 感觉是优先队列 但还是太会用…… 以后可以试一下优先队列…… 比赛之后百度了一下 发现是单调队列…… 看起来挺简单的 也算个模版题吧…… 总之思路就是维护一个单调队列…… 有用的的只有C G Q…… 那个长度最多是5的名字只用接着 根本没用…… 直接上代码…… #include<stdio.h> #include<iostream> #include<string.h> #include<algorithm&g

暑期训练狂刷系列——Foj 1894 志愿者选拔 (单调队列)

题目连接: http://acm.fzu.edu.cn/problem.php?pid=1894 解题思路: 因为出队和入队都满足队列的性质,优先单调队列的优先级有进入队列的顺序和人品的高低,在一段区间中如果出现x[i]是最大的,那么[0,i-1]区间内的数就不用记录了,所以单调队列里面可以按照人品值降序排列,输出的时候判断一下当前元素是否已经出队即可. 1 #include <cstdio> 2 #include <cstring> 3 using namespace std;

FZU 1894 志愿者选拔

我并没有多想,他们是用的数组模拟队列,然而我就是优化循环次数过得 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int node[1000010]; int main() { int t; scanf("%d",&t); while(t--) { char op[20],name[20];

UOJ#55 [WC2014]紫荆花之恋

题目描述 强强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花飞舞的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了出来. 仔细看看的话,这个大树实际上是一个带权树.每个时刻它会长出一个新的叶子节点,每个节点上有一个可爱的小精灵,新长出的节点上也会同时出现一个新的小精灵.小精灵是很萌但是也很脆弱的生物,每个小精灵 \(i\) 都有一个感受能力值 \(r_i\),小精灵 \(i, j\) 成为朋友当且仅当在树上 \(i\) 和 \(j\) 的距离 \(\text{

博弈入门

巴什博奕 巴什博奕: 题目的  类型就是 各位勇敢者要玩的第一个游戏是什么呢?很简单,它是这样定义的: 1. 本游戏是一个二人游戏; 2. 有一堆石子一共有n个: 3. 两人轮流进行; 4. 每走一步可以取走1…m个石子: 5. 最先取光石子的一方为胜: 如果游戏的双方使用的都是最优策略,请输出哪个人能赢. 巴什博弈: 以上面的 题目为例   当 最后剩下只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜. 只要能做到  给对方  留下 m+1 个 物品

单调栈/单调队列/RMQ

在上上周的交友大会中,队长大人提到了st算法,然后仔细的发呆了一个星期,于是就开始做队长的专题了, 6天后的我总算在此专题做题数目和队长一样了..明早没课,准备通宵把这几天的零散的记忆整理一下. HDU 3530 Subsequence 一开始想为何不能m和k一起放到while语句里进行处理 nowmax和nowmin保存了i之前的最大和最小值,假设此时已经出现不满足k和m的序列(A)了(比k大or比m小or both),然后我们往后找,发现了一个比序列(A)的min更小的值(me),此时now