7-5 流水作业调度 (10 分)(思路+详解+johnson解析)Come Baby!!!!!!!!!!
一:題目
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ú)空行
輸出樣例:
二:思路
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)題。
- 上一篇: 《黑色洛城》PC版图文攻略:堕落的偶像
- 下一篇: 1017 The Best Peak S