POJ 3481 Double Queue(set实现)
Double Queue
The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office in Bucharest, equipped with a modern computing environment provided by IBM Romania, and using modern information technologies. As usual, each client of the bank is identified by a positive integer Kand, upon arriving to the bank for some services, he or she receives a positive integer priority P. One of the inventions of the young managers of the bank shocked the software engineer of the serving system. They proposed to break the tradition by sometimes calling the serving desk with the lowest priority instead of that with the highest priority. Thus, the system will receive the following types of request:
| 0 | The system needs to stop serving |
| 1 KP | Add client K to the waiting list with priority P |
| 2 | Serve the client with the highest priority and drop him or her from the waiting list |
| 3 | Serve the client with the lowest priority and drop him or her from the waiting list |
Your task is to help the software engineer of the bank by writing a program to implement the requested serving policy.
Input
Each line of the input contains one of the possible requests; only the last line contains the stop-request (code 0). You may assume that when there is a request to include a new client in the list (code 1), there is no other request in the list of the same client or with the same priority. An identifier K is always less than 106, and a priority P is less than 107. The client may arrive for being served multiple times, and each time may obtain a different priority.
Output
For each request with code 2 or 3, the program has to print, in a separate line of the standard output, the identifier of the served client. If the request arrives when the waiting list is empty, then the program prints zero (0) to the output.
Sample Input
2
1 20 14
1 30 3
2
1 10 99
3
2
2
0
Sample Output
0
20
30
10
0
解题思路:
本题要求处理银行排队问题,根据每行的输入处理数据;若输入为1则继续输入两个整数,以第一个数为权值,第二个数为优先级(数值越大优先级越高)加入排队系统中;若输入为2 则处理当前优先级最高的用户,并输出用户的权值;若输入为3 则处理当前优先级最低的用户,并输出用户权值;若输入为0结束运行。若当没有排队人数则无论输入2、3都输出0。
利用set自带红黑树排序的性质,可以在集合中直接获取最高与最低优先级,用pair记录权值和优先级,将pair传入集合。用迭代器可以获得集合首位(最大优先级)和集合末尾(最小优先级),数据处理完毕后可以通过erase()删除当前用户以便后续操作。
样例分析:
Sample Input
2 //处理高优先级用户,当前无人排队输出0
1 20 14 //优先级为14的用户20开始排队
1 30 3 //优先级为3的用户30开始排队
2 //处理高优先级用户,当前队列中有 20 14 30 3 最高优先级14 输出20
1 10 99 //优先级为99的用户10开始排队
3 //处理低优先级用户,当前队列中有 10 99 30 3 最低优先级3 输出30
2 //处理高优先级用户,当前队列中有 10 99 最高优先级99 输出10
2 //处理高优先级用户, 当前无人排队输出0
0 //输入为0结束
#include <cstdio>
#include <iterator>
#include <set>
//bits/stdc++.h编译错误
using namespace std;
//利用set的排序性质
struct cmp{ //set比较方法以pair的第二个成员为基准,数值越大的在前
bool operator() (const pair<int, int> &a, const pair<int, int> &b)
{
return a.second > b.second;
}
};
set<pair<int, int>, cmp> waitingList; //用set记录当前队列
int main()
{
int n;
while(scanf("%d", &n) != EOF){ //输入数据
if(n == ) //输入为0结束运行
break;
if(n == ){ //输入为1
pair<int, int> temp;
scanf("%d%d", &temp.first, &temp.second); //记录用户权值与优先级
waitingList.insert(temp); //用户开始排队
}
if(n == ){ //输入为2
if(!waitingList.empty()){
set<pair<int, int>, cmp>::iterator it = waitingList.begin();
//获取优先级最高的用户
printf("%d\n", (*it).first); //输出用户权值
waitingList.erase(it); //删除用户
}else{
printf("0\n"); //队中无人
}
}
if(n == ){
if(!waitingList.empty()){
set<pair<int, int>, cmp>::iterator it = waitingList.end();
it--;
//获取优先级最小的用户
printf("%d\n", (*it).first); //输出用户权值
waitingList.erase(it); //删除用户
}else{
printf("0\n");//队中无人
}
}
}
return ;
}
POJ 3481 Double Queue(set实现)的更多相关文章
- POJ 3481 Double Queue STLmap和set新学到的一点用法
2013-08-08 POJ 3481 Double Queue 这个题应该是STL里较简单的吧,用平衡二叉树也可以做,但是自己掌握不够- -,开始想用两个优先队列,一个从大到小,一个从小到大,可是 ...
- POJ 3481 Double Queue(Treap模板题)
Double Queue Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15786 Accepted: 6998 Des ...
- POJ 3481 Double Queue(STL)
题意 模拟银行的排队系统 有三种操作 1-加入优先级为p 编号为k的人到队列 2-服务当前优先级最大的 3-服务当前优先级最小的 0-退出系统 能够用stl中的map 由于map本身 ...
- POJ 3481 Double Queue
平衡树.. 熟悉些fhq-Treap,为啥我在poj读入优化不能用啊 #include <iostream> #include <cstdio> #include <ct ...
- POJ 3481 Double Queue (treap模板)
Description The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office in Bucharest ...
- poj 3841 Double Queue (AVL树入门)
/****************************************************************** 题目: Double Queue(poj 3481) 链接: h ...
- hdu 1908 Double Queue
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1908 Double Queue Description The new founded Balkan ...
- 【Map】Double Queue
Double Queue Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13258 Accepted: 5974 Des ...
- poj 2259 Team Queue
Team Queue Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 2977 Accepted: 1092 Descri ...
随机推荐
- 支付宝PC网站接口对接
PC网站支付接口,请参考支付宝官方文档:https://b.alipay.com/signing/productSet.htm?navKey=all 1.需要提供签约账号.商户密钥 2.代码实现: 支 ...
- [javascript][翻译]使用javascript添加css rule
来杭一周,收获很多,成长很多. 周六在搞一个插件的时候碰到需要动态添加伪元素的需求,搜了一下解决方案,有人用正则写出了读取伪元素的函数:我觉得倒是可以通过注入css rule的方式,来让预留有某些类的 ...
- 浅谈 温故知新——HTML5!
古人有云:温故而知新.活到老,学到老,作为一枚前端的程序猿,不停的学习能够让我们对我们的技术有一个更加丰富的认识.这几天,项目已经完成,但我发现自己的知识体系存在一些短板,特别是在H5方面,所以我又回 ...
- C#中索引器的作用和实现。
官方描述:索引器允许类或结构的实例就像数组一样进行索引.索引器形态类似于,不同之处在于它们的取值函数采用参数. 这一功能在创建集合类的场合特别有用,而在其他某些情况下,比如处理大型文件或者抽象有些资源 ...
- WM_COPYDATA+BHO+Qt实现进程间通信
最近项目有一个需求:点击网页上某个按钮,通知Qt客户端.网页相关操作使用了BHO,BHO与Qt通信通过WB_COPYDATA,为什么这么麻烦呢,因为项目正好用到了BHO,可能还有其他方式,能直接通过网 ...
- c# 图片等比缩略
public Bitmap getnew(Image bit, int TargetWidth, int TargetHeight)//beishu参数为放大的倍数.放大缩小都可以,0.8即为缩小至原 ...
- 474. Ones and Zeroes
In the computer world, use restricted resource you have to generate maximum benefit is what we alway ...
- Jquery选择器 选择一个不存在的元素 为什么不会返回 false
不管找没找到,$()函数都会返回一个jquery对象,这个jquery对象有个length属性,表示找到多少个匹配的DOM元素,为0就是没找到.
- Redis存储
redis库提供了两个类:Redis和StrictRedis来实现Redis的命令操作,前者是为了兼容老版本库的集中方法,一般就用StrictRedis 一. redis基本操作 . 设置redis密 ...
- SpringData JPA复合主键
上一篇博客简单介绍了SpringData JPA实现简单的CRUD,分页与多条件的排序,那里的主键类型是Long,有时我们会遇到主键不是一个的,复合主键,经过调研如下.确定一个人,不能只根据他的姓名来 ...