貪心演算法之多級排程問題
阿新 • • 發佈:2018-12-16
“多機排程問題
問題描述
給了你n臺機器,m個物品需要加工
每一個物件加工花費的時間是bi ;
我們需要尋找到一個方案,使得這個加工的總時間較短
解題思路與演算法思想
- 很原始的貪心模型
- 從最長的時間開始貪心
由於耗時最長的物件需要連續加工很長時間
所以最基本的想法就是先讓機器加工最長耗時的物件
為了防止所有其他機器都在等待一個機器的情況
程式模型的建立
- 通過對物品的加工好是的排序
- 之後讓已分配加工時間最短的機器加工當時耗時最長的物品
資料結構的選用
- 選陣列儲存時間
程式設計流程
- 讀入資料
- 資料排序
- 物件分配
程式設計偽碼演算法
sort(所有需要的時間) while(所有物品沒有別分配完) { find(現在被分配任務最少的機器) 把這個機器分配上未加工物件中需要耗時最長的 }
源程式編碼清單
#include<iostream> #include<stdio.h> #include<vector> #include<utility> #include<algorithm> using namespace std ; bool comp(pair<int ,int>a ,pair<int ,int> b) ; int main(void) { int n ; scanf("%d",&n ) ; int m ; scanf("%d",&m) ; if(n>=m) { vector<int>b ; int tem_int ; for(int i = 0 ;i<m ;i++) { scanf("%d",&tem_int) ; b.push_back(tem_int) ; } sort(b.begin(),b.end()) ; printf("%d",b.back()) ;//can be used like this return 0 ; } else { vector<pair<int ,int > > b ; int tem_int ; pair<int ,int >tem_pair ; for(int i = 0 ;i<m ;i++) { scanf("%d",&tem_int) ; tem_pair = make_pair(i,tem_int) ; b.push_back(tem_pair) ; } sort(b.begin(),b.end(),comp) ; vector<int> time ; for(int i = 0 ; i<n ;i++) { time.push_back(0) ; } //已經排好序了??????????????????????????????? //怎麼貪心??????????????????? int cnt = 0 ; for(int i = 0 ;i<m ;i++) { vector<int>::iterator it = min_element(time.begin(),time.end()) ; (*it) = (*it)+b[i].second ; } printf("%d",*max_element(time.begin(),time.end())) ; } } bool comp(pair<int ,int>a ,pair<int ,int> b) { if(a.second>b.second) { return true ; } else { return false ; } }
程式輸入、輸出
輸入:
3 10
1 2 3 4 5 6 7 8 9 10
輸出
19
輸入輸出檔案或程式執行結果截圖
時間與空間複雜度分析
- 時間複雜度:nlogn+n
程式使用說明
總結與完善