bzoj 1216 [HNOI2003]操作系统

来源:互联网 发布:百度网盘引擎源码 编辑:程序博客网 时间:2024/06/05 17:15

一开始想的用heap维护一下,但是发现输出不好搞,而且维护两个值的heap好像不怎么会做,然后学习了一发优先队列,挺好用的,直接模拟就好了,用优先队列维护一下优先级和到达时间就好了。

#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#include<queue>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;struct node{    int num,kth,arr,tex;    bool operator < (const node &a)const     {        return (kth<a.kth||(kth==a.kth&&arr>a.arr));    }};priority_queue<node>q;int t,a,b,c,d;inline void add(int a,int b,int c,int d){    node x;    x.num=a;    x.arr=b;    x.tex=c;    x.kth=d;    q.push(x);}int main(){    scanf("%d%d%d%d",&a,&b,&c,&d);    add(a,b,c,d);    t=b;    while (scanf("%d%d%d%d",&a,&b,&c,&d)==4)    {        node x=q.top();        q.pop();        int v=x.tex;        bool flag=0;        while (t+v<=b)        {            printf("%d %d\n",x.num,t+v);            t+=v;            if (q.empty())            {                t=b;                flag=1;                break;            }            x=q.top();            q.pop();            v=x.tex;        }        add(a,b,c,d);        if (flag)continue;        x.tex-=(b-t);        q.push(x);        t+=(b-t);    }    while (!q.empty())    {        node x=q.top();        q.pop();        int v=x.tex;        printf("%d %d\n",x.num,t+v);        t+=v;    }    return 0;}
0 0
原创粉丝点击