1.链接地址

https://vjudge.net/problem/POJ-1064#author=0

2.问题描述

为了购买网络电缆,评审委员会已经联系了一个本地网络解决方案提供商,他们要求为他们销售指定长度的电缆。评审委员会希望电缆尽可能长,以使参赛者尽可能地远离对方。 
公司的电缆主管被指派负责这项工作。他知道每根电缆的长度可达一厘米,他可以以厘米的精度切割它们,告诉它们必须切割的碎片的长度。然而,这一次,长度不知道,电缆主人是完全困惑。 
你要帮助电缆主,通过编写一个程序,确定电缆的最大长度,可以从股票中的电缆切割,以获得指定的件数。

输入样例

4 11
8.02
7.43
4.57
5.39

输出样例

2.00

3.解题思路

每当遇到这种在有明确区间里求一个满足题目条件的值的时候就可以考虑二分搜索

4.算法实现源代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int N = 1e6+10;
const double eps = 1e-6;
double a[N],maxx;
int n,m;
void solve()
{
    double l = 0, r = maxx;
    double ans = 0;
    while(r - l > eps)
    {
        double mid = (l+r)/2.0;
        int sum = 0;
        for(int i = 0; i < n; i ++)
            sum += (int)(a[i]/mid);
        if(sum >= m)
            l = mid;
        else
            r = mid;
    }
    printf("%.2lf\n",int(r*100)*0.01);
}
int main()
{
    int i;
    while(~scanf("%d%d",&n,&m))
    {
        maxx = 0;
        for(i = 0; i < n; i ++)
        {
            scanf("%lf",&a[i]);
            if(a[i] > maxx) maxx = a[i];
        }
        solve();
    }
    return 0;
}