1 条题解

  • 0
    @ 2024-4-20 16:31:23

    题意+思路: 对于每一个时间结点,只有可能做以下的事: 1.刚做完一个任务 输出进程号和目前的时间 当队列里有任务:找到队列里优先级最大的,进入case3 队列没有任务:进入下一个任务的时间,进入case2

    2.等待新任务 停止正在进行的任务,将新的任务放进队列,取出队列里优先级最大的,进入case3

    3.正开始做一件任务 若在下一个任务之前能做完:当前时间加上此任务需要的时间,把此任务弹出队列,进入case1 若无法在下一个任务之前做完任务:时间减去最多能做的时间,当前时间也同样加上这么多,进入case1

    参考代码
    //输入+初始化
    while (cin >> a[n+1].id >> a[n+1].st >> a[n+1].t >> a[n+1].p)
    		n++;
    	a[n+1].t = 0x7fffffff;
    
    //处理过程
        for (int i = 1; i <= n; i++)
        {
            q.push(a[i]);
    		now = a[i].st;
            while (!q.empty() && now < a[i+1].st && sum < n)
            {
                jc temp = q.top();
    			q.pop();
                int x = min(temp.t,a[i+1].st-now);
                temp.t -= x;
    			now +=x ;
                if (!temp.t) 
    			{
    				cout << temp.id << " " << now << endl;
    				sum++;
    			}
                else q.push(temp);
            }
        }
    
    • 1

    信息

    ID
    717
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    (无)
    递交数
    44
    已通过
    11
    上传者