7-2 作业调度算法--短作业优先 (30 分)(思路+详解+vector容器做法)Come Baby!!!!!!!!!!!
生活随笔
收集整理的這篇文章主要介紹了
7-2 作业调度算法--短作业优先 (30 分)(思路+详解+vector容器做法)Come Baby!!!!!!!!!!!
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一:題目
輸入N(N>0)個作業,輸入每個作業的名字,到達時間,服務時間,按照短作業優先算法,計算每個作業的完成時間,周轉時間,帶權周轉時間(保留2位小數)。輸入格式: 第一行輸入作業數目,第二行輸入作業的名字,第三行輸入到達時間,第四行輸入服務時間。輸出格式: 按照到達時間從小到大排序,第一行輸出作業的名字,第二行輸出到達時間,第三行輸出服務時間,第四行輸出完成時間,第五行輸出完成時間,第六行輸出帶權周轉時間。輸入樣例: 在這里給出一組輸入。例如:5 A B C D E 0 1 2 3 4 4 3 1 2 4 結尾無空行 輸出樣例: 在這里給出相應的輸出。例如:作 業 名:A B C D E 到達時間:0 1 2 3 4 服務時間:4 3 1 2 4 完成時間:4 10 5 7 14 周轉時間:4 9 3 4 10 帶權周轉時間:1.00 3.00 3.00 2.00 2.50這個測試數據可以有坑可以檢驗兄弟們的漏洞
補充測試數據:`
輸出結果:
作 業 名:a b c d e f 到達時間:0 4 5 6 8 10 服務時間:2 5 4 2 3 1 完成時間:2 9 19 11 15 12 周轉時間:2 5 14 5 7 2 帶權周轉時間:1.00 1.00 3.50 2.50 2.33 2.00二:思路:
思路:1.大體與先來先服務一樣
2.如果完成時間未能大于下一個的到達時間,那么還是先來先服務原則
3.如果完成時間包含后面幾個到達時間,那么就要將被包含的數據 按服務時間的遞增順序進行處理
4.每次得到完成時間,均需更新后買面的序列
三:上碼:
/**思路:1.大體與先來先服務一樣2.如果完成時間未能大于下一個的到達時間,那么還是先來先服務原則3.如果完成時間包含后面幾個到達時間,那么就要將被包含的數據 按服務時間的遞增順序進行處理**/#include<bits/stdc++.h> using namespace std;int N; vector<char>v1(100); vector<int>v2(100),v3(100); //v2:到達時間;v3:完成時間 vector<int>v4,v5;//v4:完成時間 v5:周轉時間 vector<double>v6;//v6:帶權周轉時間 void ans(){//計算周轉時間 = 完成時間 - 到達時間//帶權周轉時間 = (周轉時間 / 服務時間)for(int i = 0; i < N; i++){int Turnaround_time = 0;double loat_Wi = 0;Turnaround_time = v4[i] - v2[i];v5.push_back(Turnaround_time);loat_Wi = (double)Turnaround_time / v3[i];v6.push_back(loat_Wi); } cout << "作 業 名:"; for(int i = 0; i < N; i++){if(i == 0)cout << v1[i];else cout << ' ' << v1[i]; }cout << endl;cout << "到達時間:";for(int i = 0; i < N; i++){if(i == 0)cout << v2[i];else cout << ' ' << v2[i]; }cout << endl;cout << "服務時間:" ;for(int i = 0; i < N; i++){if(i == 0)cout << v3[i]; elsecout << ' ' << v3[i]; }cout << endl;cout << "完成時間:";for(int i = 0; i < N; i++){if(i == 0)cout << v4[i]; elsecout << ' ' << v4[i]; }cout << endl;cout << "周轉時間:";for(int i = 0; i < N; i++){if(i == 0)cout << v5[i]; elsecout << ' ' << v5[i]; }cout << endl;cout << "帶權周轉時間:";for(int i = 0; i < N; i++){if(i == 0)printf("%.2lf",v6[i]); elseprintf(" %.2lf",v6[i]);} } int main(){cin >> N;for(int i = 0; i < N; i++){cin >> v1[i]; }for(int i = 0; i < N; i++){cin >> v2[i];}for(int i = 0; i < N; i++){cin >> v3[i];}//到達時間升序處理for(int i = 0; i < N-1; i++){for(int j = N-2; j >= 0; j--){if(v2[j] > v2[j+1]){swap(v2[j],v2[j+1]);swap(v1[j],v1[j+1]);swap(v3[j],v3[j+1]);} }} //這里主要是時間軸上的計算,int finish = v2[0]+v3[0];//單獨處理第一個數據 v4.push_back(finish); for(int i = 1; i < N; i++){if(finish >= v2[i]){//完成時間大于等于到達時間 需要等待 int j;for(j = i; j < N; j++){ if(finish < v2[j])break; }int end = j-1;//break出去的時候已經不滿足條件了int start = i;//按服務時間進行排序 for(int k1 = start; k1 <= end - 1; k1++){for(int k2 = end - 1; k2 >= start; k2--){ if(v3[k2] > v3[k2+1]){swap(v3[k2],v3[k2+1]);swap(v1[k2],v1[k2+1]);swap(v2[k2],v2[k2+1]); }}} //完成時間為排完序的時間 finish += v3[start]; v4.push_back(finish); } else{finish = v2[i] + v3[i];//當完成了,還有沒有人來 v4.push_back(finish); } }//輸出到達時間升序處理for(int i = 0; i < N-1; i++){for(int j = N-2; j >= 0; j--){if(v2[j] > v2[j+1]){swap(v2[j],v2[j+1]);swap(v1[j],v1[j+1]);swap(v3[j],v3[j+1]);swap(v4[j],v4[j+1]); } }} ans(); } //測試數據 //5 //A B C D E //0 1 2 4 4 //4 3 4 2 4//5 //A B C D E //2 1 2 3 15 //4 3 4 2 4//5 //A B C D E //2 1 10 3 4 //4 3 4 2 4//5 //A B C D E //0 5 2 3 4 //4 3 4 2 4//5 //D B C A E //6 5 2 3 4 //4 3 4 2 4//6 //a b c d e f //0 4 5 6 8 10 //2 5 4 2 3 1
加油 BOY!!!!!!!!!!!!!!! 陌生的你我們共勉
總結
以上是生活随笔為你收集整理的7-2 作业调度算法--短作业优先 (30 分)(思路+详解+vector容器做法)Come Baby!!!!!!!!!!!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信和QQ如何邀请别人进群聊
- 下一篇: 7-3 作业调度算法--高响应比优先 (