POJ 1064 Cable master 题解
题目
题目链接
题目大意
提供\(N\)个绳子,要求分成\(K\)个长度相同的绳子,问分后的绳子最大长度为多少?
题解
假设最后绳子长为\(x\)
- 如果这\(n\)个绳子能分成\(k\)个长度为\(x\)的绳子,则\(x\)可行,然后将\(x\)变大,再次进行判断。
- 如果这\(n\)个绳子不能分成\(k\)个长度为\(x\)的绳子,则\(x\)不可行,然后将\(x\)变小,再次进行判断。
这样下去,总会找到最大的可行的\(x\),也就是答案。问题是,如何快速的找到\(x\),可看到,问题就在\(x\)的变大变小,如果变化的合适,将很快能接近答案。
这里可以使用二分法。初始条件为\(lb=0,\, ub=max(l_i),\, x=\frac{(lb+ub)}{2}\)
每次根据\(x\)可行与否,来变化\(lb\)或者\(ub\)。
Then show the code.
#include <cstdio>
#include <cmath>
int n, k;
double l[(int)1e4+5];
bool check(double x){
int num=0;
for(int i=1; i<=n; i++)
num += (int)(l[i]/x);
return num >= k;
}
int main(){
scanf("%d%d", &n, &k);
for(int i=1; i<=n; i++)
scanf("%lf", &l[i]);
//绳子最长为1e5
double lb=0, ub=1e5+5;
//循环100次 确保最后结果足够小
for(int i=0; i<100; i++){
double mid = (lb+ub)/2;
if(check(mid)) lb = mid;
else ub = mid;
}
//防止浮点数有精度问题
printf("%.2lf\n", floor(lb*100)/100);
return 0;
}
不忘初心方得始终