思路
二分答案,如果满足条件的就向右逼近。
判断一个答案是否满足条件,只需要对所有木棍求能分的段数之和是否大于等于k就好了。
代码
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=2e5+7; ll n,k,a[maxn],cnt; bool check(ll x){ cnt=0; for(int i=1;i<=n;i++){ cnt+=a[i]/x; } if(cnt>=k) return true; return false; } int main(){ scanf("%lld%lld",&n,&k); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); sort(a+1,a+1+n); ll l=0,r=a[n]+5,mid; while(r-l>1){ mid=l+r>>1; if(check(mid)) l=mid; else r=mid; } cout<<l; return 0; }