POJ_1064 二分搜索

/*POJ 1064
 *题目大意:有N条绳子,他们的长度分别为Li,如果从他们中切割K条长度相同的绳子的话,这K条绳子每条最长能有多长?答案保留到小数点后2位
 *算法分析:这个问题用二分搜索可以非常容易的求得答案。让我们套用二分搜索的模型试着解决这个问题。
 *   令:条件C(x):=可以得到K条长度为x的绳子
 *		则问题变成了求满足C(x)条件的最大的x。在区间初始化时, 只需使用充分大的数INF作为上界即可
 *      现在的问题是是否可以高效的判断C(x)。由于长度为Li的绳子最多可以切出floor(Li/x)段长度为x的绳子,因此
 *							C(x) = (floor(Li/x)的总和是否大于或等于K)、、它可以在O(N)的时间内被判断出来。 
*/
int N, k;
double L[MAX_N];

//判断是否满足条件 
bool C(double x)  {
	int num = 0;
	for (int i = 0; i<N; i++) 	num += (int) (L[i]/x);
	return num >= K; 
}

 
void solve() {
	double lb = 0, ub = INF;
	for (int i = 0; i<100; i++) {
		double mid = (lb+ub) / 2;
		if (C(mid))	lb = mid;
		else 	ub = mid;
	}
	
	printf("%.2f\n",floor(ub*100) / 100);
}

你可能感兴趣的:(二分搜索,poj)