某工厂有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
这并不是一道oj上的题目,反正我是没找到。。。
应该属于一类题目。
解题思路就是贪心的思想。
我们现将所有的时间排序。
第一种情况:n<=m 时间最长的工作就是我们需要求解的总时间。
第二种情况:n>m
这时候我们就将m个机器分配给前m个时间最长的工作,直到有机器空闲下来,我们将闲下的机器继续向后分配。直到分配到没有工作可做了。当前的时间再加上还没有做完的工作的最长时间就是我们所要求的总时间。
代码:
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<string.h> 5 using namespace std; 6 int a[1005],b[1005]; 7 bool cmp(int a,int b){ 8 return a>b; 9 } 10 int main(){ 11 int n,m; 12 int T; 13 cin>>T; 14 while(T--){ 15 int n,m; 16 cin>>n>>m; 17 for(int i=0;i<n;i++){ 18 scanf("%d",a+i); 19 } 20 memset(b,0,sizeof(b)); 21 sort(a,a+n,cmp); 22 if(n<=m){ 23 cout<<a[0]<<endl; 24 continue; 25 }else{ 26 int sum=0; 27 int now=m; 28 while(now<n){ 29 sum++; 30 int cnt=0; //cnt是这分钟结束后有几台机器空闲下来 31 for(int i=0;i<now;i++){ 32 b[i]++; 33 if(b[i]==a[i]){ 34 cnt++; 35 } 36 } 37 now+=cnt; 38 } 39 int mx=0; 40 for(int i=0;i<n;i++){ 41 if(a[i]>b[i]) 42 mx=max(mx,a[i]-b[i]); //找出还没做完的工作的最长时间 43 } 44 cout<<sum+mx<<endl; 45 } 46 } 47 return 0; 48 }