举杯消愁愁更愁,月底账单入水流 • 3个月前
//二分算法
//当最大段和为x时,需要分成y段 从大到小,单调递减
#include<bits/stdc++.h>
using namespace std;
int n,m,l=-1e9,r=0;
int a[5005];
int getpart(int len){ //最大段和为len,所有段和都不超过len返回段数
//每一段都小于等于len;
int part=0;
int sum=0;
for(int i=1;i<=n;i++){
if(sum+a[i]<=len){
sum+=a[i];
}else{
part++;
sum=a[i];
}
}
return part+1;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
l=max(l,a[i]); //理论最小的最大段和:每一个各分一段
r+=a[i]; //理论最大:全部是一段
}
while(l<r){
int mid=(l+r)/2;
if(getpart(mid)<=m) r=mid; //右缩左,保留mid
else l=mid+1; //mid丢掉
}
cout<<l<<endl;
return 0;
}
评论:
请先登录,才能进行评论