数组分割成M段,要求每段之和 的最大值最小。
二分查找划分。N个元素划分成N段,其最大值为最大元素,此为下界。
N个元素划分成1段,最大值为所有元素之和,此为上界。
二分每次取其中值,进行划分,如划分超过M段,则中值太小,下界上移。
如划分小于或者等于M段,则中值过大,上界下移。
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
__int64 money[100000];
__int64 low=0,high=0;
int M,N;
bool valid(__int64 val){
int group = 1;
__int64 sum = 0;
for(int i=0;i<N;++i){
if(sum+money[i]>val){
++group;
sum = money[i];
}
else
sum += money[i];
if(group>M)
return false;
}
return true;
}
void process(){
while(low<high){
__int64 mid = (low+high)/2;
if(valid(mid))
high = mid;
else
low = mid+1;
}
cout<<low<<endl;
}
int main(){
cin>>N>>M;
__int64 t;
for(int i=0;i<N;++i){
cin>>t;
money[i] = t;
low = max(low,t);
high += t;
}
process();
//system("pause");
return 0;
}