problem
- 一个长度为N的正整数数列A[i]
- 将其分成M段,并要求每段连续
- 求每段和最大值(M段各自的和中最大的那个)最小(某种方案下最小)。
solution
二分每段和的最大值mid。
如果存在一种划分方案使得每段和为mid成立,就去找更小的。反之找更大的。
!!!第4个点WA的:二分答案进行检查的时候要判断当前的数字是不是大于二分出来的答案,如果大于,就直接特判掉。
codes
#include<iostream>
using namespace std;
int n, m, a[100005];
int check(int x){
int sum = 0, cnt = 1;
for(int i = 1; i <= n; i++){
if(a[i]>x)return false;//特判
sum += a[i];
if(sum > x){//这里是>;==的时候不行(sum不可以直接等于a[i]啊)。
cnt++;
sum = a[i];
}
}
return cnt<=m;
}
int main(){
cin>>n>>m;
for(int i = 1; i <= n; i++)cin>>a[i];
int l = 1, r = (int)1e9;
while(l < r){
int mid = l+r>>1;
if(check(mid))r = mid;
else l = mid+1;
}
cout<<l<<'\n';
return 0;
}