给定的N个长度固定的木棒(长度均为整数),要求至少分为K段长度一致的木棍,问该K段木棍的最长长度。
如有3个木棒,长度为10、24、15。要求分7段,则木棍最长的长度为6。(10/6+24/6+15/6 = 7)
思路:
已知,要分的长度越长,则得到的段数越小。可用二分法。
#include<iostream>
using namespace std;
#define N 3
int stick[N] = {50, 24, 15};
int maxL, K = 7; //maxL记录木棒中最长的长度
int cal(int l){//计算该长度下的k
int ans = 0;
for(int i = 0; i < N; ++i)
ans += stick[i] / l;
return ans;
}
int get(){
int left = 0, right = maxL, mid;
while(right > left + 1){//由于满足 cal(mid) >= k 时 是left移动,故需要让left+1 和right 比较,如left = 0, right = 1时
mid = (right + left) /2;
if(cal(mid) >= K) left = mid;
else right = mid - 1; //得出的k < K,故该长度应该舍弃
}
return left;
}
int main(){
for(int i = 0; i < N; ++i)
if(maxL < stick[i]) maxL = stick[i];
cout << get();
return 0;
}