zoukankan      html  css  js  c++  java
  • 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;   
    }
              







  • 相关阅读:
    s3fs 挂载minio为本地文件系统
    P5787 线段树分治
    P5494 线段树分裂
    P1552 [APIO2012]派遣
    CF600E Lomsat gelral(线段树合并)
    P5283 异或粽子
    P4735 最大异或和(可持久化 trie)
    P3960 列队
    bzoj4316 小C的独立集
    P5021 赛道修建
  • 原文地址:https://www.cnblogs.com/csnd/p/12062565.html
Copyright © 2011-2022 走看看