描述
n条绳子,第i条绳子长度为a[i],切割成长度相同的k段,求能切割出最大的长度
样例1
2输入: n = 4; k =11 a = {8.02,7.43,4.57,5.39};
输出: 2.00 (每条绳子分割可以得到4条,3条,2条,2条,共11条绳子)
思路
将这题转化为求满足 C(x) 的最大的 x,解范围下界是个较小的可行解,上界是一个较大的不可行解,每次取中间值缩小解范围。
代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20bool C(vector<double> a,int K,double x) {
int len = a.size();
int sum = 0;
for (int i = 0; i < len; i++) {
sum += int(a[i] / x);
}
return sum >= K;
}
void solve(vector<double> a, int K) {
double lo = 0; //下界,显然0是可行解,但很不优,需要向上扩充
double hi = 10000; //上界,不可行解,需要向下收缩
//循环100次是为了尽量缩小解的范围
for (int i = 0; i < 100; i++) {
double mid = lo + (hi - lo) / 2;
if (C(a, K, mid)) { lo = mid; }
else { hi = mid; }
}
printf("%.2lf", lo);
}