HDU - 5437 - Alisha’s Party (优先队列 && 模拟)

#include 
using namespace std;
const int maxn = 150000 + 100;

struct P
{
    char name[210];
    int id;
    int val;
    friend bool operator < (const P & p1, const P & p2)//注意重载<的写法
    {
        if(p2.val == p1.val) return p1.id > p2.id;//礼物价值一样的,按照来的顺序排
        return p1.val < p2.val;//最优的是礼物价值大的
    }
} p[maxn];
int enter[maxn];
priority_queue

q; int ans[maxn];//记录进入人的编号 int main() { int T,k,m,now,t,per,cnt,Q; scanf("%d",&T); while(T--) { memset(enter,0,sizeof enter); now = cnt = 1;//当前时间和处理人数 scanf("%d %d %d",&k,&m,&Q); for(int i = 1; i <= k; i++) { p[i].id = i; scanf("%s %d",&p[i].name,&p[i].val); } for(int i = 1;i <= m; i++) { scanf("%d %d",&t,&per); enter[t] += per; } for(int i = 1; i <= k;i++) { q.push(p[i]); if(!enter[i]) continue; for(int j = 1; j <= enter[i] && !q.empty();j++) { P x = q.top(); ans[cnt++] = x.id; q.pop(); } } while(!q.empty())//最后剩的人 { P x = q.top(); ans[cnt++] = x.id; q.pop(); } for(int i = 1; i <= Q; i++) { scanf("%d",&t); printf("%s",p[ans[t]].name); if(i != Q)printf(" "); else printf("\n"); } } return 0; }

 

你可能感兴趣的:(ACM解题记录,模拟,优先队列)