二分搜索 POJ 1064 Cable master

二分搜索求最长绳子
本文介绍了一道关于利用二分搜索算法寻找从n条绳子中切割出k条长度相等且最长的绳子的经典算法题。通过定义检查函数来评估是否能获得至少k条目标长度的绳子,并采用迭代的方式逐步逼近最优解。

 

题目传送门

 1 /*
 2     题意:n条绳子问切割k条长度相等的最长长度
 3     二分搜索:搜索长度,判断能否有k条长度相等的绳子
 4 */
 5 #include <cstdio>
 6 #include <algorithm>
 7 #include <cstring>
 8 #include <cmath>
 9 using namespace std;
10 
11 const int MAXN = 1e4 + 10;
12 const int INF = 0x3f3f3f3f;
13 double w[MAXN];
14 int n, k;
15 
16 int check(double len)   {
17     int ret = 0;
18     for (int i=1; i<=n; ++i)    {
19         ret += (int) (w[i] / len);
20     }
21     return ret;
22 }
23 
24 int main(void)  {       //POJ 1064 Cable master
25     //freopen ("POJ_1064.in", "r", stdin);
26     
27     while (scanf ("%d%d", &n, &k) == 2) {
28         for (int i=1; i<=n; ++i)    {
29             scanf ("%lf", &w[i]);
30         }
31         double l = 0, r = 1e9;
32         for (int i=1; i<=100; ++i)  {
33             double mid = (l + r) / 2;
34             if (check (mid) >= k)   l = mid;
35             else    r = mid;
36         }
37         printf ("%.2f\n", floor (l * 100) / 100);
38     }
39 
40     return 0;
41 }

 

转载于:https://www.cnblogs.com/Running-Time/p/4676369.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值