HDU 5437(结构体重载、STL的应用模拟题)

来源:互联网 发布:python base64 key 编辑:程序博客网 时间:2024/06/05 02:52

转自:http://www.cnblogs.com/Apro/p/4807471.html

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

特别注意: m可以为0

代码:

#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 longusing 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;}
原创粉丝点击