贪心算法之多级调度问题

“多机调度问题

问题描述

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

 程序使用说明
 总结与完善

猜你喜欢

转载自blog.csdn.net/weixin_42222917/article/details/83211616