题目
木材厂有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目是给定了。当然,我们希望得到的小段越长越好,你的任务是计算能够得到的小段木头的最大长度。
木头长度的单位是厘米。原木的长度都是正整数,我们要求切割得到的小段木头的长度也要求是正整数。
第一行是两个正整数N和K(1 ≤ N ≤ 10000, 1 ≤ K ≤ 10000),N是原木的数目,K是需要得到的小段的数目。
接下来的N行,每行有一个1到10000之间的正整数,表示一根原木的长度。
Output
输出能够切割得到的小段的最大长度。如果连1厘米长的小段都切不出来,输出"0"。
3 7
232
124
456
Sample Output
114
思路:
刚开始用的暴力搜索,结果时间超时。最后朋友告诉我用二分法。具体思想二分法的思想读者自己查找资料阅读。
- 1、左值为0,右值为数组最大值+x (x可以取任何值,一般取1-100即可)
- 2、最后输出最大切割长度为右值-1
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int N,K;
cin>>N>>K;
int wood[10000];
for(int i=0;i<N;i++){
cin>>wood[i];
}
int lef = 0;
int max_cut = 0;
// 升序
sort(wood,wood+N);
int rig = wood[N-1]+1;
// 二分法
while(lef<rig){
int sum = 0;
int mid = (rig+lef)/2;
if(mid==0){
break;
}
for(int i=0;i<N;i++){
sum += wood[i]/mid;
}
if(sum>=K){
lef = mid+1;
}else{
rig = mid;
}
}
cout<<rig-1;
}
运行结果: