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 优先队列的主要内容,如果未能解决你的问题,请参考以下文章