题目大意:给定一组数,将其分成连续的m段,记这m段中的最大值为k,求k的最小值
思路分析:可确定最大值k在最大元素和所有元素和之间,因此可二分确定K的最小值使其满足条件。还要注意检查函数中的边界值。
#include<iostream>
using namespace std;
int n,m,A[100010];
bool f(int a) {
int i,sum,cnt;
sum=0;
cnt=1;
for(i=1;i<=n;i++){
if(sum+A[i]<=a) sum+=A[i];
else{
cnt++;
sum=A[i];
}
}
if(cnt<=m) return true;
else return false;
}
int main(){
int max,i,sum;
cin>>n>>m;
sum=max=0;
for(i=1;i<=n;i++){
cin>>A[i];
sum+=A[i];
if(A[i]>max) max=A[i];
}
int l,r,mid;
l=max;
r=sum;
while(r>l){
mid=(r+l)/2;
if(f(mid)) r=mid;
else l=mid+1;
}
cout<<l<<endl;
return 0;
}