POJ1064(二分搜索)解题报告

版权声明:个人笔记,仅供复习 https://blog.csdn.net/weixin_41162823/article/details/85113618

原题链接: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;
}

猜你喜欢

转载自blog.csdn.net/weixin_41162823/article/details/85113618
今日推荐