A49455.探险 题解
2025-06-03 21:06:59
发布于:北京
12阅读
0回复
0点赞
很典的二分啊。
简单来说,有 个数,分成 段连续的部分,让和最小的那一组尽量大。求这个最大值。
二分这个最大值 mid,check 函数直接 跑一遍,累加,一旦累加超过 mid 直接分成一组。最后判断组数是否大于等于 .
Code:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll MAXN=3e4+34;
ll n,k,l,r,ans;
ll a[MAXN];
inline bool can(const ll &mid){
ll res=0,sum=0;
for(ll i=1;i<=n;i++){
sum+=a[i];
if(sum>=mid){
res++;
sum=0;
}
}
return res>=k;
}
int main(){
cin>>n>>k;
for(ll i=1;i<=n;i++) cin>>a[i];
l=0,r=1e9;
while(l<=r){
ll mid=l+r>>1;
if(can(mid)){
ans=mid;
l=mid+1;
}
else r=mid-1;
}
cout<<ans;
return 0;
}
这里空空如也
有帮助,赞一个