您的位置:首页 > 其它

POJ_1064 二分搜索

2015-12-01 10:34 411 查看
/*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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: