Description
假设有n个任务由k个并行工作的机器来完成。完成任务i需要的时间为Ti。试设计一个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早。
算法设计:对任意给定的整数n和k,以及完成任务i需要的时间为Ti,i=1,2,3……n。计算完成这n个任务的最佳调度。
Input
第一行有2个正整数n和k。第2行的n个正整数是完成n个任务需要的时间。
Output
将计算的完成全部任务的最早时间
Sample Input
7 3
2 14 4 16 6 5 3
Sample Output
17
这题我是用搜索来做的
这题有点像接水问题
var n,k,tj,i:longint; b,t:array[0..10000]of longint; procedure kp(l,r:longint); var i,j,mid:longint; begin if l>=r then exit; i:=l;j:=r;mid:=t[(l+r)div 2]; repeat while t[i]>mid do inc(i); while t[j]<mid do dec(j); if i<=j then begin t[0]:=t[i];t[i]:=t[j];t[j]:=t[0]; inc(i);dec(j); end; until i>j; kp(l,j); kp(i,r); end; procedure search(dep,time:longint); var i:longint; begin if dep>n then if time<tj then begin tj:=time; exit; end; if time>=tj then exit; for i:=1 to k do begin b[i]:=b[i]+t[dep]; if b[i]>time then search(dep+1,b[i]) else search(dep+1,time); b[i]:=b[i]-t[dep]; end; end; begin readln(n,k);tj:=10000; fillchar(t,sizeof(t),0); for i:=1 to n do read(t[i]); kp(1,n); fillchar(b,sizeof(b),0); search(1,0); write(tj); end.