描述
给出N根木棒,长度均已知,通过切割它们来得到至少K段相等的木棒(长度为为整数),问这些长度相等的木棒最长能有多长。
参见算法笔记,P134
代码实现
先统计这些木棒的最大长度maxLength,然后从1到maxLength+1开始使用二分法,每选定一个值,算的以该值为最大长度的木棒个数,与K进行比较,最终找到第一个比K小的长度,然后再减一。
#include<iostream>
using namespace std;
const int MAX = 10;
int N, K;
int solve(int a[], int x) {//计算长度为X时的木棒个数
int count = 0;
for (int i = 0; i < N; ++i) {
count += a[i] / x;
}
return count;
}
int binarySolve(int a[], int left, int right) {//二分法求最大长度
int count = 0, mid;
while (left < right) {
mid = (left + right) / 2;
count = solve(a, mid);
if (count < K)
right = mid;
else
left = mid + 1;
}
return left - 1; //最终切割数量要小于K,故长度应再减一
}
int main() {
cin >> N >> K;
int a[MAX];
for (int i = 0; i < N; ++i) {
cin >> a[i];
}
int maxLength = a[0];
for (int j = 1; j < N; ++j) {//求最大长度
if (a[j] > maxLength)
maxLength = a[j];
}
cout << binarySolve(a, 1, maxLength + 1);
return 0;
}
注:关于binarySolve(a, 1, maxLength + 1),二分查找根据传入的值在极端情况下可能会落到最右端,导致此时left==right,再返回left-1要比实际最大值小1,因此传入的最右端应至少比实际最大长度多一,理论上只要比它大就可以,但为了检索效率,通常大1比较好。