问题描述:
给出N根木棒,长度均已知,现在希望通过切割它们来得到至少K段长度相等的木棒(长度必须为整数),问这些长度相等的木棒最长能有多长。
样例输入:
3 7
10 24 15
样例输出:
6
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e+3+10;
int n;
int solve(int a[],int left,int right,int k){
int mid,num;
while(left<right){//left==right时,表示找到了最大长度 [left,right]=[1,max]左闭右闭区间
mid=(left+right)/2;//若用left+1<right为循环条件,则(left,right]=[0,max] 左开右闭区间.left==左闭右闭区间.left-1
num=0;
for(int i=0;i<n;++i){
num+=a[i]/mid;
}
if(num>=k){//寻找第一个num<k时候的right(或者left,因为此时left==right)
left=mid+1;
}
else{
right=mid;
}
}
return right;
}
int main(){
int k,length[N]={0};
scanf("%d%d",&n,&k);
for(int i=0;i<n;++i){
scanf("%d",&length[i]);
}
sort(length,length+n);//排序找出最长的木棒
int left=1,right=length[n-1];
int maxl;
maxl=solve(length,left,right,k)-1;//最大长度=right-1
cout<<maxl<<endl;
return 0;
}