hdu5437 Alisha’s Party 优先队列

Posted 文竹balala

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu5437 Alisha’s Party 优先队列相关的知识,希望对你有一定的参考价值。

2015年长春网络赛1001

题意:有k个人要来,其中要开m次门,每次开门之前前t个人到了,可以进去p个人,最后q次询问第几个进去的人的编号

分析:这题网络赛时想到用优先队列做了,结果一直WA感觉好没道理下去后发现要对(t,p)排序,还是太弱了啊,而且下去自己敲得代码还一直有错,原来有警告都没发现,结果又是一直WA啊。。。。


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <set>
#include <vector>
using namespace std;
const int maxn = 150000 + 5;

struct node

    char name[201];
    int id;
    int val;
;
node s[maxn];
int ans[maxn];

struct st
    int  t, p;
    bool operator < (const st &a) const
    
        return t < a.t;
    
in[maxn];
struct cmp

    bool operator()(const int& i,const int&j)const//优先队列和sort里的运算符重载刚好相反,长记性了
    
        return s[i].val < s[j].val || (s[i].val == s[j].val && s[i].id > s[j].id);
    
;

priority_queue<int,vector<int>,cmp> q;
int main()

    //freopen("input.txt", "r", stdin);
    int t;
    scanf("%d",&t);
    while (t--)
    
        int k, m, qus;
        memset(s, 0, sizeof(s));
        memset(in, 0, sizeof(in));
        scanf("%d%d%d", &k, &m, &qus);

        for (int i = 1; i <= k; i++)
        
            scanf("%s%d", s[i].name, &s[i].val);
            s[i].id = i;
        
        while (!q.empty())q.pop();
        for (int i = 0; i < m; i++)
        
            scanf("%d%d", &in[i].t, &in[i].p);
        
        sort(in, in + m);
        int rear = 1;
        int cnt = 0;
        for (int i = 0; i < m; i++)
        
            for (; rear <= in[i].t; rear++)
            
                q.push(rear);
            

            for (int j = 0; j < in[i].p; j++)//此处BUG让我调了好久,注意j
            
                if (!q.empty())
                
                    int pos=q.top();
                    ans[++cnt]=pos;
                    q.pop();
                
                else break;
            
        
        for (; rear <= k; rear++)
        
            q.push(rear);
        
        while (!q.empty()) 
            int pos=q.top();
            ans[++cnt]=pos;
            q.pop();
        
        int x;
        scanf("%d", &x);
        printf("%s", s[ans[x]].name);
        for (int i = 1; i < qus; i++)
        
            scanf("%d", &x);
            printf(" %s", s[ans[x]].name);

        
        printf("\\n");
    

    return 0;



以上是关于hdu5437 Alisha’s Party 优先队列的主要内容,如果未能解决你的问题,请参考以下文章

HDU 5437 & ICPC 2015 Changchun Alisha's Party(优先队列)

hdu5437 Alisha’s Party 优先队列

HDU 5437 Alisha’s Party

Alisha's Party

hdu 5437

HDOJ5437(优先队列)