二分法截绳子

题:

N根绳子,需要M根等长的绳子,可以截取,不可以拼接

思路:
求可以截的的最长进而可以联想到二分,一般二分就是求在一个递增序列上的一个阈值。然而二分猜可能的长度,每个棒子除一下猜的长度,得到能截到的个数,然后计算总数是不是大于m,大于说明可以放大猜测的阈值,如果不够m个就往小的猜。就是这样

作者:WAzidongji
链接:https://www.nowcoder.com/discuss/163804
来源:牛客网

#include<bits/stdc++.h>
 
using namespace std;
typedef long long ll;
 
int n, m;
double a[1000010];
const double eps = 1e-4;
 
bool ok(double x)
{
    int cnt = 0;
    for(int i = 0; i < n; i++)
    {
        cnt += a[i] / x;
    }
    return cnt >= m;
}
int main()
{
    cin >> n >> m;
    for(int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    double l = 0, r = 1e9 + 77;
    while(l + eps < r)
    {
        double mid = (l + r) / 2;
        if(ok(mid)) l = mid;
        else r = mid;
    }
    printf("%.2f\n",l);
    return 0;
}

 

posted @ 2019-03-16 22:09  冰皮抹茶  阅读(333)  评论(0编辑  收藏  举报