12:双向队列
-
总时间限制:
- 5000ms 内存限制:
- 65536kB
-
描述
-
新建的 Beijing Institute Group 银行 (BIG-Bank) 在北理工开了一个营业点,他们装备了由 IBM Coral Studio 提供的现代化计算环境,使用现代的信息技术。通常,每个银行客户都有唯一的用来标识身份的正整数 K ,而每当他来到银行寻求服务时,银行都会给他一个正整数 P ,代表他的优先权。银行一个年轻的管理员李凌对软件服务系统的功能十分惊讶。他建议打破银行传统的最低优先权优先的服务方式,加入最高优先权优先的服务。于是,软件系统将得到如下类型的请求:
0 系统终止服务
1 K P 将客户 K 加到等待队列中,并赋优先权 P
2 为有最高优先权的人服务,并将他从等待队列中删除
3 为有最低优先权的人服务,并将他从等待队列中删除
银行的软件工程师张国文现在抽不开身,请你替他写一个程序实现这种服务策略。
输入
- 输入的每行包含一个可能的请求,只有最后一行是停止请求 ( 代码 0) 。你可以认为每个加入客户的请求 ( 代码 1) 中,赋予的优先权都是不同的。每个标识 K 都是小于 106 的数,优先权 P 都是小于 107 的数,客户可能请求多次服务,每次都会得到不同的优先权。 输出
- 对每个代码为 2 或 3 的请求,程序必须打印被服务的客户的标识。如果此时队列是空,那么打印 0 。 样例输入
-
2 1 20 14 1 30 3 2 1 10 99 3 2 2 0
样例输出
-
0 20 30 10 0
#include<stdio.h> #include<string.h> #include<deque> #include<vector> #include<algorithm> using namespace std; struct node1 { int rankk; int key; }; node1 node; int main() { int n; deque<node1> q; while(scanf("%d",&n)!=EOF) { if(n==2) { if(q.empty()) { printf("0\n"); } else { int p=q.back().key; q.pop_back(); printf("%d\n",p); } } else if(n==3) { if(q.empty()) { printf("0\n"); } else { int p=q.front().key; q.pop_front(); printf("%d\n",p); } } else if(n==1) { int p,pp; scanf("%d %d",&p,&pp); node.key=p; node.rankk=pp; if(q.empty()) { q.push_front(node); } else if (pp < q.front().rankk) { q.push_front(node); } else if (pp > q.back().rankk) { q.push_back(node); } else { deque<node1>::iterator it; for(it=q.begin();it!=q.end();it++) { if(pp<it->rankk) { q.insert(it,node); break; } } } } else if(n==0) break; } return 0; }