9.9 买礼物的艰辛 2719

  • 题目
  • 题解
  • 代码

题目

小X同学给小C同学选了N件礼物,决定顺序购买并赠送,但作为一个没有工资没有零花钱的可怜小朋友,有M位好心的同学伸出了援助之手,然而为了减少最高的借款量,小X同学希望OI竞赛的你为他合理规划,使得他能轻松快乐地送出礼物。

100%: n<=100000
样例输入
7 5
100
400
300
100
500
101
400

样例输出
500

题解

最大值的最小值,二分啦
注意:顺序购买。如样例,不能买了100然后买101

时间复杂度O(n log n)

代码

这坨跑得快一点

var
  n,m,i,j,k,l,r,t,mid,ans:longint;
  a:array[1..100000]of longint;
begin
  readln(n,m);
  for i:=1 to n do
    begin
      readln(a[i]);
      k:=k+a[i];
    end;
  r:=k;
  l:=1;
  while ldo
    begin
      mid:=(l+r) div 2;
      t:=0;j:=0;
        for i:=1 to n do
          if a[i]>mid then begin j:=m+1;break;end else
            begin
              if t+a[i]>mid then begin t:=0;inc(j);end;
              t:=t+a[i];
            end;
      if j<=m then
          r:=mid else
          l:=mid+1;
    end;
  writeln(r);
end.

这坨慢一点

var
  n,m,i,j,k,l,r,mid,ans:longint;
  a:array[1..100000]of longint;

function night(k:longint):boolean;
var
  i,j,l,r,t:longint;
begin
  t:=0;j:=0;
  for i:=1 to n do
    if a[i]>k then exit(false) else
    begin
      if t+a[i]>k then begin t:=0;inc(j);end;
      t:=t+a[i];
    end;
  if j>m then exit(false);
  exit(true);
end;

begin
  readln(n,m);
  for i:=1 to n do
    begin
      readln(a[i]);
      k:=k+a[i];
    end;
  r:=k;
  l:=1;
  while ldo
    begin
      mid:=(l+r) div 2;
      if night(mid) then
          r:=mid else
          l:=mid+1;
    end;
  writeln(r);
end.

你可能感兴趣的:(二分查找)