题目
给出 n 个数,让你分成 m 段,使得每段和最小。
解
二分答案。二分每段的和,然后判断能不能用m段分完。
代码
#include<cstdio>
int n, m, sum, l, r, mid, cnt, addd, a[100010];
int main(){
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; ++i){
scanf("%d",&a[i]);
sum += a[i];
}
l = 0; r = sum;
while(l < r){
mid = (l+r) / 2;
cnt = 1; addd = 0;
for(int i = 1; i <= n; ++i){
if(addd + a[i] <= mid) addd += a[i];
else if(a[i] > mid) cnt = m+1;
else{
++cnt;
addd = a[i];
}
if(cnt > m) break;
}
if(cnt <= m) r = mid;
else l = mid+1;
}
printf("%d", l);
}