hud5437-Alisha’s Party-优先队列

来源:互联网 发布:足彩n串1算法 编辑:程序博客网 时间:2024/06/07 09:54

就是裸的优先队列  (因为数据太小 了)

题意就是  一堆朋友拜访主人公  各自带了礼物

给你m次开门的机会,开门时 如果朋友没全部到齐,按以下规则

在第m次开门的时候 让礼物价值最大的前p个人进来,


全部人到齐后。让全部人进来,

求进门的人的顺序


对客人维护一个优先队列就可以了,对m,p 让前m个人进优先队列取前p个人就行了,因为数据小 暴力取就ok;

trick是 m次操作是不按顺序的,我们得排个序


#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <iostream>#include <queue>#include <map>#include <set>#include <vector>using namespace std; #define  inf 0x7fffffff  struct node{char name[205];int val;int num;bool operator<( const node& b) const    {            if (val!=b.val)        return val<b.val;            else                return num>b.num;    }};node tm[150005];    priority_queue <node> qq; node ans[150005];struct comes{    int l,r;};comes come[150005];int cmp(comes a,comes b){    return a.l<b.l; }int main(){   int t;   scanf("%d",&t);   int i;   while(t--)   {       while(!qq.empty())           qq.pop();               int ok=0;       int k,m,q;       scanf("%d%d%d",&k,&m,&q);       for (i=1;i<=k;i++)       {           scanf("%s %d",tm[i].name,&tm[i].val);           tm[i].num=i;       }       int tt,pp,j;       int last=1;        for (i=1;i<=m;i++)       {             scanf("%d%d",&tt,&pp);             come[i].l=tt;             come[i].r=pp;        }        sort(come+1,come+1+m,cmp);       for (i=1;i<=m;i++)       {           tt=come[i].l;           pp=come[i].r;                     for (j=last;j<=tt;j++)           {                qq.push(tm[j]);           }        last=tt+1;           for (j=1;j<=pp;j++)           {               if (qq.empty())               {                   break;               }               node tmp=qq.top();               qq.pop();               ans[++ok]=tmp;           }       }       for (j=last;j<=k;j++)       {               qq.push(tm[j]);        }       for (j=ok+1;j<=k;j++)       {            if (qq.empty())                    break;          node tmp=qq.top();               qq.pop();               ans[j]=tmp;       }       int ttt;       int line=0;              for (i=1;i<=q;i++)       {                      scanf("%d",&ttt);        if (!line)            printf("%s",ans[ttt].name);        else             printf(" %s",ans[ttt].name);        line=1;       }       printf("\n");   }    return 0;}


0 0