POJ 1064 Cable master(二分法寻找最优解)


1.题意是找到一个长度,可以使所给的绳子能切割成k个这样长度的绳子,最小精度是厘米;
2.方法就是二分查找,每次比较此次的mid值是否符合题意;
3.因为使用double我们无法用left<=right终止循环,那就循环足够多的次数来提高精度即可;
4.最后输出不可以直接使用.2f,因为会四舍五入;

代码:

#include<iostream>
#include<cmath>
using namespace std;
const int MAX_N=1e4+99;
const double INF=1e7;
int n,k;
double cab[MAX_N];
bool ok(double m){
	int ans=0;
	for(int i=0;i<n;i++) ans+=(int)(cab[i]/m);
	return ans>=k;
}
int main(){
	scanf("%d%d",&n,&k);
	for(int i=0;i<n;i++) scanf("%lf",cab+i);
	double l=0,r=INF;
	for(int i=0;i<100;i++){
		double mid=(l+r)/2;
		if(ok(mid)) l=mid;
		else r=mid;
	}
	printf("%.2f",floor(l*100)/100);
	return 0;
}