题目:
把一个包含m个正整数的序列划分(划分表面不相交)成k个非空连续子序列
设第i个序列的和为S(i) 找一个划分使最大的S(i)(记为maxp)的尽量小
多种方案优先取S(1)最小,,S(1)相同S(2)最小,,,依此类推。
思路:
记P(x)为将序列划分为m个,maxp=x,满足m<=k;(具体实现用solve(x)<=k)这样就有了二分法的判断条件(用二分法快速找到最小的x)
最终找到的x即为maxp
k表示对应需要‘/’的最小个数
对于5个元素的数组 1 1 1 1 1
maxp与k关系如下
maxp | 1 | 2 | 3 | 4 | 5 |
k | 4 | 3或2 | 1 | 1 | 0 |
函数solve()采用贪心法
取maxp=2时,算出的k是唯一的等于3(而4事实上也满足 但贪心总是选择最小的)
此时solve(maxp)<=K 这时会尝试pmax=1但返回的是k=5>K 最终pmax还是等于2
(事实上由lower_bound()的性质 插入的位置①能保持有序②位于最左 当k=4时 插入的位置1,2,3,4,5对应的函数值5,3,2,