题目大意:
给定 n n n个树木 a i ai ai,,要求切出 k k k段,在这个前提之下,使得单端最大化
分析:
前提:切除段数>=
k
k
k
目标:长度
l
l
l最大化,,就是求
l
l
l
m
a
x
max
max
考虑一个答案区间[
l
l
l,
r
r
r]
假定当前选定长度为
m
i
d
mid
mid,对应切出段数为
t
m
p
tmp
tmp
考虑决策性:
①若
t
m
p
tmp
tmp>=
k
k
k,
m
i
d
mid
mid合法,找更大的长度
往右边进行二分,[
l
l
l,
r
r
r]—>[
m
i
d
+
1
mid+1
mid+1,
r
r
r]
②若
t
m
p
tmp
tmp<
k
k
k,
m
i
d
mid
mid不合法,因为没有办法切出来
k
k
k段
那么
m
i
d
mid
mid无法切出来
k
k
k段,那么比
m
i
d
mid
mid大的也肯定切不出来
往左边进行二分,[
l
l
l,
r
r
r]—>[
l
l
l,
m
i
d
−
1
mid-1
mid−1]
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N],n,k;
long long sum=0;
bool check(int x){ // 切x
long long tmp=0;
for (int i=1;i<=n;i++) {
tmp=tmp+1ll*a[i]/x;
}
return(tmp>=k);
}
int main(){
cin>>n>>k;
int l=1,r=1;
for (int i=1;i<=n;i++){
cin>>a[i];
sum=sum+1ll*a[i];
r=max(r,a[i]);
}
if(sum<k) {
puts("0");
return 0;
}
int ans;
while (l<=r){
int mid=(l+r)/2;
if (check(mid)){
ans=mid;
l=mid+1;
}else{
r=mid-1;
}
}
cout<<ans;
return 0;
}
华丽结束