SOFTWARE

 SOFTWARE

一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每个软件划分成m个模块,由公司里的技术人员分工完成,每个技术人员完成同一软件的不同模块的所用的天数是相同的,并且是已知的,但完成不同软件的一个模块的时间是不同的,每个技术人员在同一时刻只能做一个模块,一个模块只能由一个人独立完成而不能由多人协同完成。一个技术人员在整个开发期内完成一个模块以后可以接着做任一软件的任一模块。写一个程序,求出公司最早能在什么时候交付软件。

【输入】

输入文件第一行包含两个由空格隔开的整数n和m,其中1≤n≤100,1≤m≤100。接下来的n行每行包畲两个用空格隔开的整数d1和d2,d1表示该技术人员完成第一个软件中的一个模块所需的天数,d2表示该技术人员完成第二个软件中的一个模块所需的天数,其中

l≤d1,d2≤100。

【输出】

输出文件仅有一行包含一个整数d,表示公司最早能于d天后交付软件。

【样例】

 SOFTWARE.IN

  3   20

  1   1

  2   4

  1   6

  SOFTWARE.OUT

  18

【样例】

最快的方案是第一个技术人员完成第二个软件的18个模块,用时18天,第三个技术人员完成第一个软件的18个模块,用时18天,其余的模块由第二个技术人员完成,用时12天,做完所有模块需要18天。如果第一个技术人员完成第二个软件的17个模块,第三个技术人员完成第一个软件的17个模块,其余的模块由第二个技术人员完成,需要用时18天,做完所有模块仍然需要18天,所以少于18天不可能做完所有模块。

=====================================

二分答案+DP验证

=======================

type
  re=record
       d1,d2:longint;
     end;
var
  n,m:longint;
  peo:array[1..100]of re;
  f:array[0..100,0..100]of longint;
procedure init;
begin
  assign(input,'software.in');
  assign(output,'software.out');
  reset(input); rewrite(output);
end;

procedure terminate;
begin
  close(input); close(output);
  halt;
end;

function pd(t:longint):boolean;
var
  i,j,k:longint;
  now:longint;
begin
  fillchar(f,sizeof(f),$ff);
  f[0,0]:=0;
  for i:=1 to n do
    for j:=0 to m do
      for k:=j downto 0 do
        if f[i-1,k]<>-1 then
        begin
          now:=t-(j-k)*peo[i].d1;  //记录剩下的时间
          if now<0 then break;
          if f[i,j]<f[i-1,k]+now div peo[i].d2 then
            f[i,j]:=f[i-1,k]+now div peo[i].d2;
        end;
  if f[n,m]>=m then exit(true);
  exit(false);
end;

procedure main;
var
  i:longint;
  l,r,mid:longint;
  ans:longint;
begin
  readln(n,m);
  for i:=1 to n do
    readln(peo[i].d1,peo[i].d2);
  l:=1; r:=m; ans:=0;
  while l<=r do          //二分时间
    begin
      mid:=(l+r) shr 1;
      if pd(mid) then
        begin
          ans:=mid;
          r:=mid-1;
        end
        else l:=mid+1;
    end;
  writeln(ans);
end;

begin
  init;
  main;
  terminate;
end.     

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页