日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

7-5 流水作业调度 (10 分)(思路+详解+johnson解析)Come Baby!!!!!!!!!!

發(fā)布時(shí)間:2023/12/4 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 7-5 流水作业调度 (10 分)(思路+详解+johnson解析)Come Baby!!!!!!!!!! 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一:題目

n個(gè)作業(yè){1,2,…,n}要在由2臺(tái)機(jī)器M1和M2組成的流水線(xiàn)上完成加工。每個(gè)作業(yè)加工的順序都是先在M1上加工,然后在M2上加工。M1和M2加工作業(yè)i所需的時(shí)間分別為ai和bi。流水作業(yè)調(diào)度問(wèn)題要求確定這n個(gè)作業(yè)的最優(yōu)加工順序,使得從第一個(gè)作業(yè)在機(jī)器M1上開(kāi)始加工,到最后一個(gè)作業(yè)在機(jī)器M2上加工完成所需的時(shí)間最少。

輸入格式:
第一行給出作業(yè)個(gè)數(shù)n(0<n<100)

第二行起的n行,每行兩個(gè)數(shù)ai和bi

輸出格式:
兩個(gè)數(shù)字,以空格分隔,分別表示M1機(jī)器運(yùn)行結(jié)束的時(shí)間和M2機(jī)器運(yùn)行結(jié)束的時(shí)間。

輸入樣例:

6 30 80 120 100 50 90 20 60 90 30 110 10

結(jié)尾無(wú)空行
輸出樣例:

420 430

二:思路

1.判斷動(dòng)態(tài)規(guī)劃:
首先m1的加工結(jié)束時(shí)間就是所有的時(shí)間和,但m2的加工時(shí)間和最小值,
求解過(guò)程是跳躍性的 所以判定為動(dòng)態(tài)規(guī)劃
2.這道題用到了johnson算法,我是拿個(gè)例子來(lái)理解的,
比如:假設(shè)再m1上的加工時(shí)間為a,在m2上的加工時(shí)間為b
如果作業(yè)i和作業(yè)j滿(mǎn)足min(aj,bi) > min (ai,bj) 則稱(chēng)作業(yè)i和j
滿(mǎn)足johnson法則

i在m1和m2上的加工時(shí)間為 3,4
j在m1和m2上的加工時(shí)間為 6,7
min(4,6) > min(3,7)
則作業(yè)i和j滿(mǎn)足johnson法則

若先加工i
m2的結(jié)束時(shí)間 = 3+4+2+7 = 16
若先加工j
m2的結(jié)束時(shí)間 = 6+7+4 = 17

所以說(shuō)johnson確定了加工的順序

3.那么在處理數(shù)據(jù)的時(shí)候我們看到了一對(duì)一的摸樣,但不能用map容器
因?yàn)閿?shù)據(jù)當(dāng)中有重復(fù)的部分,這時(shí)候我們完全可以用結(jié)構(gòu)體數(shù)組來(lái)實(shí)現(xiàn)
同一個(gè)下標(biāo),但其可以含有多個(gè)值,java當(dāng)中也可以創(chuàng)建一個(gè)對(duì)象來(lái)實(shí)現(xiàn)
但擔(dān)心java 的虛擬機(jī)可能會(huì)超時(shí)。。。

4.本題中的johnson的算法的舉例:



上面的例子是我理解時(shí)候看別人的例子,分享給大家

下面的例子:是本題的例子

三:上碼

前言注釋一下:1.這個(gè)題用完 Johnson的算法后,就基本上做完了,和前幾道動(dòng)態(tài)規(guī)劃的題思路都不一樣

這個(gè)當(dāng)中的排序 用的是重寫(xiě)sort方法 利用結(jié)構(gòu)體數(shù)組來(lái)處理數(shù)據(jù)(自認(rèn)為本題唯一有成就感的地方)

/**思路:1.判斷動(dòng)態(tài)規(guī)劃:首先m1的加工結(jié)束時(shí)間就是所有的時(shí)間和,但m2的加工時(shí)間和最小值,求解過(guò)程是跳躍性的 所以判定為動(dòng)態(tài)規(guī)劃2.這道題用到了johnson算法,我是拿個(gè)例子來(lái)理解的,比如:假設(shè)再m1上的加工時(shí)間為a,在m2上的加工時(shí)間為b如果作業(yè)i和作業(yè)j滿(mǎn)足min(aj,bi) > min (ai,bj) 則稱(chēng)作業(yè)i和j滿(mǎn)足johnson法則i在m1和m2上的加工時(shí)間為 3,4j在m1和m2上的加工時(shí)間為 6,7min(4,6) > min(3,7) 則作業(yè)i和j滿(mǎn)足johnson法則 若先加工im2的結(jié)束時(shí)間 = 3+4+2+7 = 16若先加工jm2的結(jié)束時(shí)間 = 6+7+4 = 17所以說(shuō)johnson確定了加工的順序3.那么在處理數(shù)據(jù)的時(shí)候我們看到了一對(duì)一的摸樣,但不能用map容器因?yàn)閿?shù)據(jù)當(dāng)中有重復(fù)的部分,這時(shí)候我們完全可以用結(jié)構(gòu)體數(shù)組來(lái)實(shí)現(xiàn)同一個(gè)下標(biāo),但其可以含有多個(gè)值,java當(dāng)中也可以創(chuàng)建一個(gè)對(duì)象來(lái)實(shí)現(xiàn)但擔(dān)心java 的虛擬機(jī)可能會(huì)超時(shí)。。。 */ #include<bits/stdc++.h> using namespace std;struct Node{int number1; // 在m1上的加工時(shí)間int number2;// 在m2上的加工時(shí)間 };//N1集合當(dāng)中ai的遞增排序 bool sort_N1(Node a,Node b){return a.number1 < b.number1; } //N2中按bi的降序排序 bool sort_N2(Node a,Node b){return a.number2 > b.number2; } int main(){int N;int a[101];int b[101];Node *stu1 = new Node[101];Node *stu2 = new Node[101]; Node *stu3 = new Node[101]; cin >> N; for(int i = 0; i < N; i++){cin >> a[i] >> b[i];}// for(int i = 0; i < N; i++){ // cout << b[i] << ' '; // }//開(kāi)始處理數(shù)據(jù)在N1的集合當(dāng)中是作業(yè)ai < bi(即在m2上的加工時(shí)間大于在m1上的加工時(shí)間)//N2上的集合是作業(yè)的(ai > bi) //還要注意的是在N1上是按照ai的遞增排序,在N2上是按照bi的遞減排序int k1 = 0,k2 = 0;for(int i = 0; i < N; i++){//集合N1上 if(a[i] < b[i]){stu1[k1].number1 = a[i];stu1[k1].number2 = b[i];k1++;}else{//集合N2上 stu2[k2].number1 = a[i];stu2[k2].number2 = b[i];k2++;}}// for(int i = 0; i < k1; i++){ // cout << stu1[i].number1 << ' ' << stu1[i].number2 << endl; // } //對(duì)N1集合進(jìn)行排序(按ai的遞增排序) sort(stu1,stu1+k1,sort_N1);//對(duì)N2集合進(jìn)行排序(按bi的遞減順序進(jìn)行排序)sort(stu2,stu2+k2,sort_N2); //將N1和N2集合合并(N1在前,N2在后)int k3 = 0;for(int i = 0; i < k1; i++){stu3[k3].number1 = stu1[i].number1;stu3[k3].number2 = stu1[i].number2;k3++;} for(int i = 0; i < k2; i++){stu3[k3].number1 = stu2[i].number1;stu3[k3].number2 = stu2[i].number2;k3++; }//驗(yàn)證數(shù)據(jù) // for(int i = 0; i < k3; i++){ // cout << stu3[i].number1 << ' '; // }//計(jì)算時(shí)間m1,m2的結(jié)束時(shí)間int m1,m2;m1 = stu3[0].number1;//第一個(gè)工作在m1執(zhí)行完的時(shí)間m2 = stu3[0].number2 + m1;//第一個(gè)工作的總體執(zhí)行時(shí)間for(int i = 1; i < N; i++){m1 = m1 + stu3[i].number1;//第i個(gè)工作在m1上的執(zhí)行時(shí)間if(m1 < m2){//說(shuō)明m2上的工作還沒(méi)有完成 m2 = m2 + stu3[i].number2;//工作累積 }else if(m1 > m2){//說(shuō)明m2需要等待,因?yàn)閙1上的工作還未完成 m2 = m1 + stu3[i].number2; } } cout << m1 << ' ' << m2; } //20 30 50 120 90 110 //60 80 90 100 30 10


加油boy!! 睡覺(jué)了寶貝哈哈哈哈哈哈哈哈哈哈哈!

總結(jié)

以上是生活随笔為你收集整理的7-5 流水作业调度 (10 分)(思路+详解+johnson解析)Come Baby!!!!!!!!!!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。