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.     

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值