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;
    }
    
  • 相关阅读:
    小程序入坑记:TodoList
    小程序入坑记:懒加载
    JS案例:Socket聊天室(两种方式)
    JS案例:继承和深复制
    React(四)进阶
    React(三)TableBar,ToDoList,Redux案例
    【Junit_Ant】使用Eclipse自带的Junit和Ant,生成测试报告
    【Loadrunner_WebService接口】对项目中的GetProduct接口生成性能脚本
    【Jmeter_WebService接口】对项目中的GetProduct接口生成性能脚本
    【Loadrunner_Http接口】使用Loadrunner对天气信息的接口编写脚本
  • 原文地址:https://www.cnblogs.com/Yinku/p/10986410.html
Copyright © 2011-2022 走看看