HDU 5437 Alisha’s Party (2015年长春赛区网络赛A题)

1.题目描述:点击打开链接

2.解题思路:本题是多关键字的排序题目,可以事先定义好优先级,然后利用一个优先队列来模拟“到来”和“进门”这2个过程,有2个地方需要小心:1.题目中输入的t,p需要事先排序;2.不要忘记处理最后一次开门时候的情况。

3.代码:

#include<iostream>
#include<algorithm>
#include<cassert>
#include<string>
#include<sstream>
#include<set>
#include<bitset>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<cctype>
#include<complex>
#include<functional>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;

#define me(s)  memset(s,0,sizeof(s))
#define rep(i,n) for(int i=0;i<(n);i++)
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair <int, int> P;

const int N=150000+10;
struct Node
{
    char name[210];
    int val;
    int rank;
    void read(int i)
    {
        rank=i;
        scanf("%s%d",name,&val);
    }
    bool operator<(const Node&rhs)const
    {
        if(val!=rhs.val)return val<rhs.val;
        return rank>rhs.rank;
    }
}a[N],b[N];

struct Open
{
    int t,p;
    void read()
    {
        scanf("%d%d",&t,&p);
    }
    bool operator<(const Open&rhs)const
    {
        return t<rhs.t;
    }
}r[N];
int query[N];
Node ans[105];
int n,m,q;


void print()
{
    for(int i=0;i<n;i++)
        printf("%s %d\n",b[i].name,b[i].val);
}
void solve()
{
    int st=0,cnt=0;
    priority_queue<Node>pq;
    for(int i=0;i<m;i++)
    {
        int pos=r[i].t,num=r[i].p;
        for(int j=st;j<pos;j++)//“到达”
            pq.push(a[j]);
        while(num--)  //“进门”
        {
            if(pq.empty())break;
            b[cnt++]=pq.top();pq.pop(); //b数组存放进门的顺序
        }
        st=pos;
    }
    for(int j=st;j<n;j++)pq.push(a[j]); //处理最后一次开门
    while(!pq.empty())
    {
        b[cnt++]=pq.top();pq.pop();
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&n,&m,&q);
        for(int i=0;i<n;i++)
            a[i].read(i);
        int st=0;
        me(r);
        for(int i=0;i<m;i++)
            r[i].read();
        sort(r,r+m);  //事先要对t,p排序
        for(int i=0;i<q;i++)
            scanf("%d",&query[i]);
        solve();
        for(int i=0;i<q;i++)
         printf("%s%c",b[query[i]-1].name," \n"[i==q-1]);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值