只有长度大于等于x的木棍才能切出长度为x的木棍,而可以切出木棍长为x的木棍k条,那么长为x-1的木棍也至少能切除k条,具有单调性,二分找最大值,二分起点为1,终点为原本木棍中的mx;
ans初始为-1只能过90%,我的理解是会存在无解的情况,但题目输出要求是一个非负整数,所有应该将ans初始为0
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll inf = 1e12;
const int N = 2e5+10;
int n;
ll k,a[N];
bool check(ll x){
int pos = lower_bound(a,a+n,x)-a;
ll res = 0;
for(int i = pos;i < n;i++){
res += (a[i]/x);
}
return res >= k;
}
int main(){
scanf("%d%lld",&n,&k);
for(int i = 0;i < n;i++){
scanf("%lld",a+i);
}
sort(a,a+n);
ll l = 1,r = a[n-1];
ll ans = 0;
while(l <= r){
ll mid = l+r>>1;
if(check(mid)){
ans = mid;
l = mid+1;
}else r = mid-1;
}
printf("%lld\n",ans);
return 0;
}
京公网安备 11010502036488号