POJ1064(二分搜索)解题报告
原题链接:POJ1064
题意简述:有N根绳子,它们长度分别为Li。如果从他们中切割出K条长度相同的绳子的话,这K条绳子每条最长能有多长?答案保留到小数点后俩位。
解题思路:用二分搜索方法来判断。首先假定一个解,判断其是否可行,不断缩小解的范围,从而得出答案。本题可以使用实数域上的的精度控制(即设置eps判断)或者干脆循环个几百次来逼近精度。
注意点:
- printf()保留小数位时四舍五入问题。(有点迷,这个需要仔细考虑)
- 循环终止条件问题,最终答案是左边界还是右边界?
代码示例:
#include<cstdio>
#include<cmath>
const int maxn = 11000;
const double eps = 10e-6;
double len[maxn];
int n,k;
bool C(double size){
int cnt = 0;
for(int i = 0;i < n;i++) cnt += len[i]/size;
return cnt >= k;
}
int main(){
scanf("%d%d",&n,&k);
for(int i = 0;i < n;i++) scanf("%lf",&len[i]);
double l = 0,r = 3000000;
while(l + eps < r){
double mid = (l+r)/2;
if(C(mid)) l = mid;
else r = mid;
}
printf("%.2f\n",floor(r*100)/100);
return 0;
}