當(dāng)前位置:
首頁(yè) >
LA3135简单多路归并(优先队列)
發(fā)布時(shí)間:2025/6/17
46
豆豆
生活随笔
收集整理的這篇文章主要介紹了
LA3135简单多路归并(优先队列)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:
? ? ? 有N個(gè)任務(wù),每個(gè)任務(wù)都有自己的時(shí)間間隔(就是每t秒請(qǐng)求執(zhí)行一次)和任務(wù)id,這n個(gè)任務(wù)公用一個(gè)cpu,每次我們都執(zhí)行時(shí)間靠前的,如果相同時(shí)間內(nèi)有多個(gè)任務(wù),就執(zhí)行任務(wù)id小的,要求模擬出執(zhí)行的前n個(gè)任務(wù)都是誰(shuí)。
思路:
? ? ?這個(gè)是不是就是操作系統(tǒng)里的FCFS算法啊!這個(gè)要模擬可以用優(yōu)先隊(duì)列去做,開(kāi)一個(gè)結(jié)構(gòu)體,有三個(gè)變量,一個(gè)是id,一個(gè)是時(shí)間間隔t,另一個(gè)是總時(shí)間st,每次取出都是按照a.st > b.st || a.st == b.st && a.id > b.id (這里是優(yōu)先隊(duì)列里的寫(xiě)法,不要誤會(huì)) ? 一開(kāi)始把所有的任務(wù)都進(jìn)隊(duì)列此時(shí)st=t,然后取出一個(gè)最小的作為第一個(gè)任務(wù),然后把取出來(lái)這個(gè)的a.st+=a.t之后進(jìn)隊(duì)列,就這樣反復(fù)執(zhí)行,執(zhí)行n次就行了,這個(gè)方法叫做多路歸并問(wèn)題,比較簡(jiǎ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\n" ,tou.youxianji);
? ? ? ?xin = tou;
? ? ? ?xin.time += xin._time;
? ? ? ?q.push(xin);
? ? }
? ? return 0; ??
}
? ? ? ? ??
? ? ? 有N個(gè)任務(wù),每個(gè)任務(wù)都有自己的時(shí)間間隔(就是每t秒請(qǐng)求執(zhí)行一次)和任務(wù)id,這n個(gè)任務(wù)公用一個(gè)cpu,每次我們都執(zhí)行時(shí)間靠前的,如果相同時(shí)間內(nèi)有多個(gè)任務(wù),就執(zhí)行任務(wù)id小的,要求模擬出執(zhí)行的前n個(gè)任務(wù)都是誰(shuí)。
思路:
? ? ?這個(gè)是不是就是操作系統(tǒng)里的FCFS算法啊!這個(gè)要模擬可以用優(yōu)先隊(duì)列去做,開(kāi)一個(gè)結(jié)構(gòu)體,有三個(gè)變量,一個(gè)是id,一個(gè)是時(shí)間間隔t,另一個(gè)是總時(shí)間st,每次取出都是按照a.st > b.st || a.st == b.st && a.id > b.id (這里是優(yōu)先隊(duì)列里的寫(xiě)法,不要誤會(huì)) ? 一開(kāi)始把所有的任務(wù)都進(jìn)隊(duì)列此時(shí)st=t,然后取出一個(gè)最小的作為第一個(gè)任務(wù),然后把取出來(lái)這個(gè)的a.st+=a.t之后進(jìn)隊(duì)列,就這樣反復(fù)執(zhí)行,執(zhí)行n次就行了,這個(gè)方法叫做多路歸并問(wèn)題,比較簡(jiǎ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\n" ,tou.youxianji);
? ? ? ?xin = tou;
? ? ? ?xin.time += xin._time;
? ? ? ?q.push(xin);
? ? }
? ? return 0; ??
}
? ? ? ? ??
總結(jié)
以上是生活随笔為你收集整理的LA3135简单多路归并(优先队列)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: UVA11997求前k个和,多路归并问题
- 下一篇: LA3027简单带权并查集