题目here

优先队列练习题

有n个人依次进入城堡,每个人有礼物价值v,当第t个人到的时候,主人开门允许p个人进去(礼物价值越大越先进去,礼物价值一样时先到先进)。最后,主人会再开一次门,让还没有进去的人都按照优先级进去。然后有q个询问,问地nq进去的个的名字。

优先队列做,需要对t,p那组数据排序

#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
    char name[220];
    int val,id;
    friend bool operator < (node a,node b)
    {
        if(a.val==b.val)return a.id>b.id;
        return a.val<b.val;
    }
}a[200020];
int n,m,Q;
priority_queue<node>q;
vector<node>ans;
struct query
{
    int t,q;
}qu[200020];
bool cmp(query a,query b)
{
    return a.t<b.t;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&n,&m,&Q);

        while(!q.empty())q.pop();
        ans.clear();
        for(int i=1;i<=n;i++){
            scanf("%s%d",a[i].name,&a[i].val);
            a[i].id=i;
        }
        int cnt=0,c=0;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&qu[i].t,&qu[i].q);
        }
        sort(qu,qu+m,cmp);
        int j=1;
        for(int i=0;i<m;i++)
        {
            for(;j<=qu[i].t;j++)
            {
                q.push(a[j]);
            }
            if(q.size()<=qu[i].q)
            {
                while(!q.empty())
                {
                    ans.push_back(q.top());
                    q.pop();
                }
            }
            else{
                for(int k=0;k<qu[i].q;k++)
                {
                    ans.push_back(q.top());
                    q.pop();
                }
            }
        }
        while(j<=n)q.push(a[j++]);
        while(!q.empty())
        {
            ans.push_back(q.top());
            q.pop();
        }
        while(Q--)
        {
            int t;
            scanf("%d",&t);
            if(Q==0)printf("%s\n",ans[t-1].name);
            else printf("%s ",ans[t-1].name);
        }

    }
    return 0;
}

 

posted on 2015-09-18 21:05  kylehz  阅读(226)  评论(0编辑  收藏  举报