(经典贪心算法问题2)多机调度问题

作者在 2012-03-19 15:00:13 发布以下内容

某工厂有n个独立的作业,由m台相同的机器进行加工处理。作业i所需的加工时间为ti,任何作业在被处理时不能中断,也不能进行拆分处理。现厂长请你给他写一个程序:算出n个作业由m台机器加工处理的较短时间。

输入第一行T(1<T<100)表示有T组测试数据。每组测试数据的第一行分别是整数n,m(1<=n<=10000,1<=m<=100),接下来的一行是n个整数ti(1<=t<=100)。输出所需的较短时间。(提示:不一定是最优解)样例输入2 2 2 1 5 6 3 2 5 13 15 16 20样例输出5 28
#include <stdio.h>
int main()
{
    int t,n,m,ti[10000];
    scanf("%d",&t);
    while(t--)
    {
        int i,j,co[100]={0},max,k,min;
        scanf("%d%d",&n,&m);
        for(i=0;i<n;i++)
            scanf("%d",&ti[i]);
        for(i=0;i<n;i++) //对时间进行从大到小的排序
        {
            for(k=i,max=ti[i],j=i;j<n;j++)
                if(ti[j]>max)
                {
                    max=ti[j];
                    k=j;
                }
            ti[k]=ti[i];
            ti[i]=max;
        }
        if(n<=m) //当机器数目多时,直接输出最大时间,极为所需最少时间
        {
            printf("%d\n",ti[0]);
            continue;
        }
        else //机器数目少时
        {
            for(i=0;i<n;i++) //思路:总是把任务交给当前最空闲的机器
            {
                min=co[0];
                for(k=0,j=1;j<m;j++)
                    if(co[j]<min)
                    {
                        min=co[j];
                        k=j;
                    }
                co[k]+=ti[i];
            }            
        }
        max=co[0];
        for(i=1;i<m;i++)
            if(co[i]>max)
                max=co[i];
        printf("%d\n",max);
    }
    return 0;
}
 
默认分类 | 阅读 10450 次
文章评论,共0条
游客请输入验证码
文章分类
最新评论