HDU5437 Alisha’s Party 优先队列
可能出现的问题:
1.当门外人数不足p人时没有判断队列非空,导致RE。
2.在m次开门之后最后进来到一批人没有入队。
3.给定的开门时间可能是打乱的,需要进行排序。
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<cstring> #include<iostream> #include<vector> using namespace std; struct people { char name[203]; int arrive; int value; /* friend bool operator <(people a,people b) { if(a.value!=b.value) return a.value<b.value; return a.arrive>b.arrive; } */ }; struct cmp { bool operator() (const people a,const people b) const { if(a.value!=b.value) return a.value<b.value; return a.arrive>b.arrive; } }; struct door { int t; int p; }; bool cmp1(door a,door b) { return a.t<b.t; } people peo[150003]; char n[150003][203]; door a[150003]; priority_queue < people , vector <people> , cmp > s; /*priority_queue <people> s;*/ int main() { int T; int k,m,q; int i,j,num,v; scanf("%d",&T); while(T--) { scanf("%d%d%d",&k,&m,&q); for(i=1;i<=k;i++) { scanf("%s",peo[i].name); scanf("%d",&peo[i].value); peo[i].arrive=i; } j=num=1; for(i=1;i<=m;i++) { scanf("%d%d",&a[i].t,&a[i].p); } sort(a+1,a+m+1,cmp1);//排序 for(i=1;i<=m;i++) { for(;j<=a[i].t;j++) { s.push(peo[j]); } for(v=1;v<=a[i].p&&!s.empty();v++)//非空 { strcpy(n[num++],(s.top()).name); s.pop(); } } for(;j<=k;j++)//最后一批入队 { s.push(peo[j]); } while(!s.empty()) { strcpy(n[num++],(s.top()).name); s.pop(); } for(i=1;i<=q;i++) { scanf("%d",&k); if(i<q) printf("%s ",n[k]); else printf("%s",n[k]); } printf("\n"); } return 0; }