您的位置:首页 > 其它

hdu5437 Alisha’s Party 优先队列

2015-09-15 23:19 295 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: