poj 1064 Cable master(二分)

题目链接:http://poj.org/problem?id=1064

题意

有 N 条绳子,它们的长度分别为 Li 。如果从它们中切割出 K 条长度相同的绳子的话,这 K 条绳子每条最长能有多长?答案保留到小数点后 2 位。

思路

二分确认每次是否至少能切割出 K 条绳子。

代码

#include <cstdio>
#include <cmath>

const int MAX_N = 10010;
const double INF = 1e6;

int N, K;
double L[MAX_N];

bool fit(double x) {
    int num = 0;
    for (int i = 0; i < N; i++) {
        num += (int)(L[i] / x);
    }
    return num >= K;
}

int main() {
    scanf("%d %d", &N, &K);

    for (int i = 0; i < N; i++) {
        scanf("%lf", &L[i]);
    }

    double lb = 0, ub = INF;

    for (int i = 0; i < 100; i++) {
        double mid = (lb + ub) / 2;
        if (fit(mid)) lb = mid;
        else ub = mid;
    }

    printf("%.2f\n", floor(ub * 100) / 100);
}

 

posted @ 2020-04-08 14:53  Kanoon  阅读(106)  评论(0)    收藏  举报