【洛谷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);
    }
} 

 

posted @ 2017-10-27 21:37  那一抹落日的橙  阅读(285)  评论(0编辑  收藏  举报