【洛谷P2278】操作系统
这个题忘了判断在新加进程之前能完成多个进程的可能性了,所以wa了半天,直到看到学长的题解
#include<iostream> #include<cstdio> #include<vector> #include<queue> using namespace std; struct in { int h,s,y; bool operator <(const in &b)const { if(y==b.y) return h>b.h; return y<=b.y; }//以优先级作为第一关键字,编号作为第二关键字,做一个大根堆 }; priority_queue<in>qwq; int a,b,c,d,tail; int main() { while(~scanf("%d%d%d%d",&a,&b,&c,&d)) { while(!qwq.empty())//要考虑在加新的物品前还能完成多少进程 { in qaq=qwq.top(); qwq.pop(); if(tail+qaq.s<=b) tail+=qaq.s,printf("%d %d\n",qaq.h,tail); else { qaq.s-=(b-tail),qwq.push(qaq);break; } } qwq.push((in){a,c,d}); tail=b; } while(!qwq.empty())//所有的进程都已经进入堆,按照优先级做完就好 { in qaq=qwq.top(); qwq.pop(); tail+=qaq.s; printf("%d %d\n",qaq.h,tail); } }