算法设计例题:多机调度问题(贪心)
memory limit: 32768KB | time limit: 1000MS
描述:
输入
输入的第一个为测试样例的个数T( T <= 100 ),接下来有T个测试样例。每个测试样例的第一行是两个整数n和m( n < 1000, m < 1000 ),接下来有n行,每行一个整数表示第i个作业所需的处理时间
输出
对应每个测试样例输出一行,每行输出每组数据加工完所有任务所需的最短时间。
输入样例
输出样例
17
多机调动为NP完全类问题,目前无法求出最优解,但是使用贪心算法可求出次优解;
思路:1.将任务花费时间按逆序排列;
2.先将花费时间长任务的加入机器;
3.找到最先完成任务的机器,将次长的任务加入该机器;
新函数:
一. 非修改序列算法之min_element和max_element
1.*min_element(a,a+n)-------为求出地址a~a+n中的最小值;
2.*max_element(a,a+n)-------为求出地址a~a+n中的最大值;
该函数可自定义比较方式:
bool abscmp(int a, int b)
{
return (abs(a) < abs(b));
}
1.*min_element(a,a+n,abscmp)------- 为求出地址a~a+n中的绝对值最小的值 ;
2.*min_element(a,a+n,abscmp)------- 为求出地址a~a+n中的绝对值最大的值 ;
PS:其中最大(小)值是第一个最大(小)值,还是最后一个,看cmp(比较方式)中有没有等于号;
该函数最大的优点为非修改性序列算法;
这道题排序之所以用该函数,不用sort是因为sort会改变原有序列,需要多次操作效率不高;
二.初始化函数memest
memset(a,0,sizeof(a))------老函数了,就不解释了
优点:
1.char ch[10]
比如memset(ch,0,8),就是把数组ch前八项置为零,后面的不一定为零。比如刚开始ch[1]='z',ch [8]='a',ch[9]='b',经过memset后,ch[1]为零了,而ch[8],ch[9]都不变.
2.struct sample_struct
{
char csName[16];
int iSeq;
int iType;
}stTest;
memset(&stTest,0,sizeof(struct sample_struct));--即可完成对结构体的清零
上源码:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int x,n;
cin>>x>>n;
int speed[1000];
int machine[100];
memset(speed,0,sizeof(speed)); //初始化
memset(machine,0,sizeof(machine));
for(int i=0;i<x;i++)
cin>>speed[i];
sort(speed,speed+x,cmp); //按任务所需时间逆序排列
for(i=0;i<x;i++)
*min_element(machine,machine+n)+=speed[i]; //找出最早完成工作的机器,并把下一个任务赋给他
cout<<*max_element(machine,machine+n)<<endl;
}
return 0;
}
//每天进步一些