LA3135简单多路归并(优先队列)

题意:
      有N个任务,每个任务都有自己的时间间隔(就是每t秒请求执行一次)和任务id,这n个任务公用一个cpu,每次我们都执行时间靠前的,如果相同时间内有多个任务,就执行任务id小的,要求模拟出执行的前n个任务都是谁。


思路:
     这个是不是就是操作系统里的FCFS算法啊!这个要模拟可以用优先队列去做,开一个结构体,有三个变量,一个是id,一个是时间间隔t,另一个是总时间st,每次取出都是按照a.st > b.st || a.st == b.st && a.id > b.id (这里是优先队列里的写法,不要误会)   一开始把所有的任务都进队列此时st=t,然后取出一个最小的作为第一个任务,然后把取出来这个的a.st+=a.t之后进队列,就这样反复执行,执行n次就行了,这个方法叫做多路归并问题,比较简单,而且容易想到和理解。


 


#include<queue>
#include<stdio.h>


using namespace std;


typedef struct NODE
{
   int youxianji ,time ,_time;
   friend bool operator < (NODE a ,NODE b)
   {
      return a.time > b.time || a.time == b.time && a.youxianji > b.youxianji;
   }
}NODE;


NODE tou ,xin;


int main ()
{
    char str[10];
    int i ,k;
    priority_queue<NODE>q;
    while(scanf("%s" ,str) && str[0] != '#')
    {
        scanf("%d %d" ,&xin.youxianji ,&xin.time);
        xin._time = xin.time;
        q.push(xin);                 
    }
    scanf("%d" ,&k);
    while(k--)
    {
       tou = q.top();
       q.pop();
       printf("%d " ,tou.youxianji);
       xin = tou;
       xin.time += xin._time;
       q.push(xin);
    }
    return 0;   
}
          







原文地址:https://www.cnblogs.com/csnd/p/12062564.html