二分答案
题意:
给你一个非负数数组和一个数字m,你要把数组切成m段,使得每段元素之和的最大值最小.
输出这个最小值.
数据范围:
0<m<=数组size<=14000
(数组元素是int范围)
思路:
什么使最大最小,最小最大,先上二分答案套路,不行再开始想.
你要切m段,问和的最大值的最小值是很难的.
但反过来,你要使得和的最大值小于等于一个数,问最少可以切多少段,这是很简单的,用贪心即可.
从左往右统计区间和,超过阈值就切一刀,最后看切成了多少段.
当m=n的时候(n是数组size),显然答案是数组元素最大值max.
当m=1的时候,显然答案是数组元素之和sum.
那么答案显然是在[max,sum]之间,对应m在[1,n]之间.
答案越大,m越小.于是我们二分答案,用上面贪心的方法算出该答案最少的m,然后二分即可.
二分复杂度O(logn),贪心一遍要O(n),总的是O(nlogn).
总结:
二分答案,每个答案用贪心找出最少的段数.