1. 程式人生 > >貪心演算法之多級排程問題

貪心演算法之多級排程問題

“多機排程問題

問題描述

給了你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

 程式使用說明
 總結與完善