P1852 舰长的礼物

发布时间 2023-05-25 12:35:59作者: 刘海烽
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>

using namespace std;

const double EPS = 1e-8;

int main()
{
    int n, k;
    cin >> n >> k;

    // 读入护心毛长度并求出平均值
    vector<double> L(n);
    double sum_L = 0;
    for (int i = 0; i < n; ++i) {
        cin >> L[i];
        sum_L += L[i];
    }
    double avg = sum_L / k;

    // 二分查找最大长度
    double left = 0, right = avg;
    double ans = -1;
    while (right - left >= EPS) {
        double mid = (left + right) / 2;
        int cnt = accumulate(L.begin(), L.end(), 0, [&](int s, double l) { return s + static_cast<int>(l / mid); });
        if (cnt >= k) {
            ans = mid;
            left = mid;
        } else {
            right = mid;
        }
    }

    // 输出答案
    if (ans != -1) {
        printf("%.2f\n", ans);
    } else {
        cout << 0 << endl;
    }

    return 0;
}