二分答案——划分数列

COGS p917 划分数列

【分析】

即k序列和

可采用二分答案的思想,设出一个答案ans,循环将和不超过ans的几个数分为一部分。直到最后若可以分为k部分则减小上界,反之增加下界。直到确定答案。

 1 var
 2   n,k,i,p,l,r,m,s:longint;
 3   a:array[1..100000] of longint;
 4 begin
 5 assign(input,'seqa.in');
 6 reset(input);
 7 assign(output,'seqa.out');
 8 rewrite(output);
 9   readln(n,k);
10   for i:=1 to n do
11   begin
12     read(a[i]); inc(r,a[i]);
13   end;
14   while r-l>1 do begin
15     m:=(l+r) shr 1;
16     s:=0; p:=0;
17     for i:=1 to n do
18       if s+a[i]<=m then s:=s+a[i]
19         else begin inc(p); s:=a[i]; end;
20     if p+1>k then l:=m else r:=m;
21   end;
22   writeln(r);
23 close(input);
24 close(output);
25 end.
参考程序
原文地址:https://www.cnblogs.com/vacation/p/5413659.html