Double Queue

Double Queue

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 11   Accepted Submission(s) : 4
Problem Description

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 K and, 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:

0The system needs to stop serving
1 K PAdd client K to the waiting list with priority P
2Serve the client with the highest priority and drop him or her from the waiting list
3Serve 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是找出P最大的数,3是找出P最小的数;
思考:刚开始想到的是优先队列(priority queue),因为这个队列可以自定义排序,但是考虑到3的操作是找出最小的数,也就是说要让队列尾端的数出列,暂时应该做不到删除和提取优先队列里面的元素吧。然后有考虑到了一些以前做单词数用过的set 容器,又把它复习了一遍,其中有看到了另外的一个双端队列的容器(dequ),但是一点也不熟练,继续看set中的一些方法,经过一步一步的探索,终于写出来了,通过这道题目我决定学习STL,因为里面的一些容器的使用太方便了,比如map(现在还不会用)
注意点:在set 容器中使用迭代器找最后一个和开始的一个元素师,先要定义一个迭代器(set <类型>:: iterator i;) 然后使用set.begin();//set.end();,使用set.end时要自减一次,我也不知道为什么;
然后附上代码吧
#include <iostream>
#include <set>
#include <cstdio>
using namespace std;

typedef struct node
{
    int k,p;
};

bool operator<(const node &a,const node &b)
{
    return a.p < b.p;
}
int main()
{
    int code;
    node f;
    set <node> st;
    st.clear();
    while(scanf("%d",&code),code)
    {
        if(code==1)
        {
            scanf("%d %d",&f.k,&f.p);
            st.insert(f);
        }
        else if(code==2)
        {
            if(st.empty())
                printf("0\n");
            else
            {
                set<node>::iterator i;
                i=st.end();
                i--;
                printf("%d\n",i->k);
                st.erase(st.find(*i));
                /*
                iterator 是一个迭代器,这里需要定义一个<node>迭代器
                来表示set容器里面的最后一个元素的前一个元素,但为什么
                我需要的结果会是最后一个的前一个元素我也不知道
                */
            }
        }
        else
        {
            if(st.empty())
                printf("0\n");
            else
            {
                set<node> ::iterator i;
                i=st.begin();
                printf("%d\n",i->k);
                st.erase(st.find(*i));

                /*printf("%d\n",st.begin());
                st.erase(st.begin()); 这样写会越界,RE*/
            }
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值