题目大意
有正整数 n , k n,k n,k 和 n n n 段长度均为正整数的木材,将它们锯成 k k k 段长度相同的木头,求最大长度。
解题思路
二分答案即可。时间复杂度 O ( n log 2 L ) O(n\log_2L) O(nlog2L)。病历本:二分的右端点。
#include <cstdio>
#include <cstdlib>
#include <cstring>
const int MAXN=100010;
typedef long long ll;
#define max(x,y) ((x)>(y)?(x):(y))
int n, k;
int a[MAXN+10];
inline int read (){
int s=0; char c;
do c=getchar (); while ('0'>c||'9'<c);
while ('0'<=c&&'9'>=c)
s=s*10+c-'0', c=getchar ();
return s;
}
int check (int le){
ll cnt=0;
for (int i=1; i<=n; ++i)
cnt+=(ll)a[i]/(ll)le;
return cnt>=k?1:0;
}
int main(){
n=read (); k=read ();
int left=1, right=-1, mid, ans;
for (int i=1 ;i<=n; ++i){
a[i]=read ();
right=max (right, a[i]);
}
while (left<=right){
mid=(left+right)/2;
if (check (mid)){
ans=mid;
left=mid+1;
}else
right=mid-1;
}
printf ("%d",ans);
}