题解
2025-05-19 20:30:55
发布于:北京
60阅读
0回复
0点赞
简单来说,让你把一个数列分成连续的不超过 段,求每一段重量和中的最大值,最小化之后,是多小。
最大值最小化,明显的二分,check 也不难写。
Code:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll MAXN=2e5+25;
ll n,k,l,r,mid,ans;
ll a[MAXN];
inline bool can(const ll &mid){
ll res=1,sum=0;
for(ll i=1;i<=n;i++){
if(a[i]>mid) return false;
sum+=a[i];
if(sum>mid){
sum=a[i];
res++;
}
}
return res<=k;
}
int main(){
cin>>n>>k;
for(ll i=1;i<=n;i++) cin>>a[i];
l=0,r=1e18;
while(l<=r){
mid=l+r>>1;
if(can(mid)){
r=mid-1;
ans=mid;
}
else l=mid+1;
}
cout<<ans;
return 0;
}
这里空空如也
有帮助,赞一个