class Solution {
public:
/**
*@param L: Given n pieces of wood with length L[i]
*@param k: An integer
*return: The maximum length of the small pieces.
*/
int BSearch(vector<int> L,long long temp,int n,int k){
long long first=1;
long long end=temp;
long long mid;
int m;
long long sum;
while(first<end){
sum=0;
m=n;
mid=(first+end)/2;
while(m--){
sum+=L[m]/mid;
}
if(sum>=k)
first=mid+1;
else if(sum<k)
end=mid-1;
// cout<<first<<" "<<end<<" "<<sum<<endl;
}
m=n;
sum=0;
while(m--){
sum+=L[m]/end;
}
if(sum>=k){
// cout<<end<<endl;
return end;
}
else
return end-1;
}
int woodCut(vector<int> L, int k) {
// write your code here
if(L.empty())
return 0;
int n=L.size();
int m=n;
long long sum=0;
while(m--){
sum+=L[m];
}
// cout<<sum<<" "<<L[1]<<endl;
if(sum<k)
return 0;
long long temp;
temp=sum/k;
// cout<<sum<<" "<<temp<<" "<<k<<" "<<n<<endl;
return BSearch(L,temp,n,k);
}
};
有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为 k。当然,我们希望得到的小段越长越好,你需要计算能够得到的小段木头的最大长度。 注意事项木头长度的单位是厘米。原木的长度都是正整数,我们要求切割得到的小段木头的长度也要求是整数。无法切出要求至少 k 段的,则返回 0 即可。您在真实的面试中是否遇到过这个题? Y