HDU 5437 Alisha’s Party

题意:有k个人带着价值vi的礼物来,开m次门,每次在有t个人来的时候开门放进来p个人,所有人都来了之后再开一次门把剩下的人都放进来,每次带礼物价值高的人先进,价值相同先来先进,q次询问,询问第n个进来的人的名字。

解法:一道现场wa到死的模拟……拿set/map/priority_queue维护一下序列。赛后重写一遍……依旧wa到死……我只想说……

m可以为0

m可以为0

m可以为0啊!

orz……

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long

using namespace std;

struct node
{
    int id, val;
    char name[205];
    bool operator < (const node &tmp) const
    {
        if(val == tmp.val) return id < tmp.id;
        return val > tmp.val;
    }
}p[150005];
struct opendoor
{
    int a, b;
    bool operator < (const opendoor &tmp) const
    {
        return a < tmp.a;
    }
}od[150005];
set <node> s;
int query[105];
int main()
{
    int T;
    while(~scanf("%d", &T))
    {
        while(T--)
        {
            s.clear();
            int n, m, q;
            scanf("%d%d%d", &n, &m, &q);
            for(int i = 1; i <= n; i++)
            {
                scanf("%s%d", p[i].name, &p[i].val);
                p[i].id = i;
            }
            for(int i = 0; i < m; i++)
                scanf("%d%d", &od[i].a, &od[i].b);
            sort(od, od + m);
            int maxq;
            for(int i = 0; i < q; i++)
            {
                scanf("%d", &query[i]);
                maxq = max(maxq, query[i]);
            }
            vector <int> ans;
            int cnt = 0;
            for(int i = 1; i <= n && ans.size() < maxq; i++)
            {
                s.insert(p[i]);
                while(od[cnt].a == i && cnt < m)//要在这里判一下……因为m为0时就会使用上一个样例的输入……所以初始化一下也是可以的……
                {
                    for(int j = 0; j < od[cnt].b && !s.empty() && ans.size() < maxq; j++)
                    {
                        ans.push_back(s.begin() -> id);
                        s.erase(s.begin());
                    }
                    cnt++;
                }
            }
            while(!s.empty() && ans.size() < maxq)
            {
                ans.push_back(s.begin() -> id);
                s.erase(s.begin());
            }
            for(int i = 0; i < q; i++)
            {
                if(i) printf(" ");
                cout << p[ans[query[i] - 1]].name;
            }
            puts("");
        }
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/Apro/p/4807471.html