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 l<r do
    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 l<r do
    begin
      mid:=(l+r) div 2;
      if night(mid) then
          r:=mid else
          l:=mid+1;
    end;
  writeln(r);
end.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值