这道题也是第二次做,第一次做看题解,这一次自己独立完成。我们二分最小的最大值,如果一个a[]大于这个最大值,显然是不合理的。如果cnt<=k就return true,为什么<也return true呢,因为这是在寻找最佳的答案
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int n,k;
ll a[maxn];
ll sum;
bool check(ll x){
ll cnt=0,num=0;
// cout<<x<<endl<<endl;
for(int i=1;i<=n;i++){
if(a[i]>x)return false;
if(num+a[i]<=x){
num+=a[i];
// cout<<num<<endl;
}
else{
num=a[i];
cnt++;
// cout<<num<<endl;
}
}
cnt++;
// cout<<cnt<<endl;
if(cnt<=k)return true;
else return false;
}
ll binary(ll l,ll r){
ll mid,ans=0;
while(l<=r){
mid=l+(r-l)/2;
if(check(mid))ans=mid,r=mid-1;
else l=mid+1;
}
return ans;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
printf("%lld\n",binary(0,sum));
return 0;
}