hud5437-Alisha’s Party-优先队列

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

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

给你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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值