zoukankan      html  css  js  c++  java
  • 洛谷

    https://www.luogu.org/problemnew/show/P2278
    题目没有说同时到达的优先级最大的应该处理谁。
    讲道理就是处理优先级最大的。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    struct Process {
        int id;
        int itime;
        int dtime;
        int pri;
    
        inline bool operator<(const Process& p)const {
            if(pri==p.pri)
                //大根堆,大的先出,符号反向
                return itime>p.itime;
            else
                return pri<p.pri;
        }
    
        inline bool pri_less_than(const Process &p) {
            return pri<p.pri;
        }
    
        inline void input(int &i,int &it,int &dt,int &p) {
            id=i;
            itime=it;
            dtime=dt;
            pri=p;
        }
    
    } p,cur;
    
    priority_queue<Process> pq;
    ll curtime,deltatime,pretime,nexttime;
    
    void show_state() {
        printf("ptime=%lld  ctime=%lld  dtime=%lld
    ",pretime,curtime,deltatime);
        printf(" curid=%d  curdtime=%d
    ",cur.id,cur.dtime);
        printf(" pq.size=%d
    ",(int)pq.size());
        printf("
    ");
    }
    
    void change_process() {
        if(pq.empty())
            return;
        if(cur.id==0) {
            //puts("next process!");
            cur=pq.top();
            pq.pop();
            nexttime=curtime+cur.dtime;
            //show_state();
        } else if(cur.pri_less_than(pq.top())) {
            //puts("change process!");
            //命令保存当前进程并取出新进程,更新时间
            pq.push(cur);
            cur=pq.top();
            pq.pop();
            nexttime=curtime+cur.dtime;
            //show_state();
        }
    }
    
    void do_process() {
        //puts("do process!");
        if(cur.id==0)
            return;
        //show_state();
        ll mintime=min(deltatime,(ll)cur.dtime);
        deltatime-=mintime;
        pretime+=mintime;
        cur.dtime-=mintime;
        if(cur.dtime==0) {
            printf("%d %lld
    ",cur.id,pretime);
            cur.id=0;
            nexttime=-1;
        }
        //show_state();
    }
    
    void update() {
        do {
            do_process();
            //当前进程做不完了,堆顶是不是有比它大的?
            change_process();
        } while(cur.id&&deltatime);
        //CPU正忙,尽可能从堆里面取出进程
    
    }
    
    int main() {
    #ifdef Yinku
        freopen("Yinku.in","r",stdin);
    #endif // Yinku
        int id,itime,dtime,pri;
        scanf("%d%d%d%d",&id,&itime,&dtime,&pri);
    
        curtime=itime;
        pretime=itime;
        deltatime=curtime-pretime;
    
        p.input(id,itime,dtime,pri);
        pq.push(p);
        update();
    
        while(~scanf("%d%d%d%d",&id,&itime,&dtime,&pri)) {
            while(cur.id&&itime>nexttime) {
                //puts("!");
                pretime=curtime;
                curtime=nexttime;
                deltatime=curtime-pretime;
                update();
            }
    
            //puts("?");
            if(cur.id==0)
                pretime=itime;
            else
                pretime=curtime;
            curtime=itime;
            deltatime=curtime-pretime;
            p.input(id,itime,dtime,pri);
            pq.push(p);
            update();
        }
    
        pretime=curtime;
        curtime=1e18;
        deltatime=curtime-pretime;
        update();
    
        return 0;
    }
    
  • 相关阅读:
    可视化工具连接mysql报1862【mysql修改登录密码】
    Java面试常被问到的题目+解答
    MyBatis启动:MapperStatement创建
    JavaScript Array(数组)对象
    分布式与集群的区别是什么?
    【触发器】MySQL触发器使用详解
    c++冒泡排序的模板函数设计
    c/c++性能优化--- cache优化的一点杂谈
    BZOJ 3181([Coci2012]BROJ-最小质因子为p的第k小素数)
    POJ 1026 Cipher
  • 原文地址:https://www.cnblogs.com/Yinku/p/10986410.html
Copyright © 2011-2022 走看看