欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

HDU5437 Alisha’s Party(优先队列+模拟)

程序员文章站 2022-07-28 18:45:21
Source 2015 ACM/ICPC Asia Regional Changchun Online 题意:有k个人带着价值vi的礼物来,开m次门,每次在有t个人来的时候开门放...

Source 2015 ACM/ICPC Asia Regional Changchun Online

题意:有k个人带着价值vi的礼物来,开m次门,每次在有t个人来的时候开门放进来p个人,所有人都来了之后再开一次门把剩下的人都放进来,每次带礼物价值高的人先进,价值相同先来先进,q次询问,询问第n个进来的人的名字。
分析:优先队列+模拟就可以了,只是注意m可以为0。
#include 
#include 
#include 
#include 
#include 
#include
#include 
#include 
#include 
#include 
using namespace std;
const double eps = 1e-6;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
#define ll long long
#define CL(a,b) memset(a,b,sizeof(a))
#define lson (i<<1)
#define rson ((i<<1)|1)
#define MAXN 150010

struct node
{
    int id,v;
    char name[220];
    bool operator < (const node &tmp) const
    {
        if(v == tmp.v) return id < tmp.id;
        return v > tmp.v;
    }
}p[MAXN];

struct opendoor
{
    int a,b;
    bool operator < (const opendoor &tmp) const
    {
        return a < tmp.a;
    }
}od[MAXN];

set s;
int query[110];

int main()
{
    int T,n,m,q;
    scanf("%d",&T);
    while(T--)
    {
        s.clear();
        scanf("%d%d%d",&n,&m,&q);
        for(int i=1; i<=n; i++)
        {
            scanf("%s %d",p[i].name, &p[i].v);
            p[i].id = i;
        }
        for(int i=0; i ans;
        int cnt = 0;
        for(int i=1; i<=n&&ans.size()id);
                    s.erase(s.begin());
                }
                cnt++;
            }
        }
        while(!s.empty() && ans.size()id);
            s.erase(s.begin());
        }
        for(int i=0; i