[HNOI2003]操作系统 优先队列用法
题:https://www.cometoj.com/problem/1046
#include<bits/stdc++.h> using namespace std; typedef long long ll; struct node{ int id,daoda,xiaohao,val; bool operator<(const node &b)const{ if(val==b.val) return daoda>b.daoda; return val<b.val; } }; struct NODE{ int id,ti; }; vector<NODE>ans; priority_queue<node>que; int main(){ node p; int lasttime=0; while(~scanf("%d%d%d%d",&p.id,&p.daoda,&p.xiaohao,&p.val)){ if(que.empty()){ lasttime=p.daoda; que.push(p); continue; } //cout<<"!!!!"<<endl; int sumti=p.daoda-lasttime; int curti=lasttime; node u; NODE q; while(!que.empty()&&sumti>=que.top().xiaohao){ u=que.top(); que.pop(); sumti-=u.xiaohao; curti+=u.xiaohao; q.id=u.id; q.ti=curti; ans.push_back(q); } if(!que.empty()&&sumti!=0){ u=que.top(); que.pop(); u.xiaohao=max(0,u.xiaohao-sumti); curti+=u.xiaohao; if(u.xiaohao>0) que.push(u); else{ q.id=u.id; q.ti=curti; ans.push_back(q); } } que.push(p); lasttime=p.daoda; } while(!que.empty()){ //cout<<"!!"<<endl; node u=que.top(); que.pop(); NODE q; q.id=u.id; q.ti=lasttime+u.xiaohao; ans.push_back(q); lasttime+=u.xiaohao; } for(int i=0;i<ans.size();i++){ printf("%d %d\n",ans[i].id,ans[i].ti); } return 0; }