“多机调度问题
问题描述
给了你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
程序使用说明
总结与完善