最小m段和问题(sum)

算法:二分答案

分析:跟TYVJ上的收入计划基本一样,都是假设一个最小值代入验证,如果成立的话就缩小左区间并搜索左区间,否则在右区间里查找。

program sum;

const
 maxn=100;

var
 n,m,tot:longint;
 a:array [0..maxn] of longint;

procedure init;
var
 i:longint;
begin
 readln(n,m);
 for i:=1 to n do
  begin
   read(a[i]);
   inc(tot,a[i]);{求和,和是最大值,即最差的情况。}
  end;
end;

function check(x:longint):boolean;
var
 i,ans,k:longint;
begin
 ans:=0;
 k:=0;
 i:=1;
 while (i<=n) and (k<m) do
  begin
   inc(ans,a[i]);
   if ans>x then
    begin
     inc(k);
     ans:=0;
     dec(i);
    end;
   inc(i);
  end;
 if i>n then exit(true) else exit(false);
end;

function find(l,r:longint):longint;
var
 mid:longint;
begin
 if l=r then exit(l);
 mid:=(l+r) shr 1;
 if check(mid) then exit(find(l,mid)) else exit(find(mid+1,r));
end;

begin
 assign(input,'sum.in'); reset(input);
 assign(output,'sum.out'); rewrite(output);
 
 init;
 writeln(find(1,tot));
 
 close(input); close(output);
end.

 

再次强化求最X值的最X值问题百分之九十以上可以用二分答案法来做,并且这样写起来也好写一些。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值