題目
木材廠有一些原木,現在想把這些木頭切割成一些長度相同的小段木頭,需要得到的小段的數目是給定了。當然,我們希望得到的小段越長越好,你的任務是計算能夠得到的小段木頭的最大長度。
木頭長度的單位是厘米。原木的長度都是正整數,我們要求切割得到的小段木頭的長度也要求是正整數。
第一行是兩個正整數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;
}
運行結果:
