题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5437
思路:优先队列模拟,注意最后一次门外人全部进入。
#include<cstdio> #include<queue> #include<cstring> #include<iostream> #include<algorithm> #define debu using namespace std; const int maxn=150000+50; struct Node { int id,val; Node(int id=0,int val=0):id(id),val(val) {} bool operator < (const Node &rhs) const { if(val==rhs.val) return id>rhs.id; else return val<rhs.val; } }; int t,n,m,Q; vector<int> ans; char name[maxn][250]; priority_queue<Node> q; int val[maxn],open[maxn],cmd[maxn]; int main() { #ifdef debug freopen("in.in","r",stdin); #endif // debug scanf("%d",&t); while(t--) { ans.clear(); memset(open,0,sizeof(open)); scanf("%d%d%d",&n,&m,&Q); for(int i=1; i<=n; i++) scanf("%s%d",name[i],&val[i]); for(int i=0; i<m; i++) { int id,num; scanf("%d%d",&id,&num); open[id]=num; } for(int i=0; i<Q; i++) scanf("%d",&cmd[i]); for(int i=1; i<=n; i++) { q.push(Node(i,val[i])); int tot=open[i]; while(!q.empty()&&tot) { //cout<<q.top().id<<endl; ans.push_back(q.top().id); tot--,q.pop(); } } while(!q.empty()) { //cout<<q.top().id<<endl; ans.push_back(q.top().id); q.pop(); } for(int i=0; i<Q-1; i++) printf("%s ",name[ans[cmd[i]-1]]); printf("%s\n",name[ans[cmd[Q-1]-1]]); } return 0; }
原文:http://blog.csdn.net/wang2147483647/article/details/52122656