POJ 1064 Cable master(二分)

POJ 1064 Cable master(二分)


题意:现在有N个绳子,需要这N条绳子切割成K段,问长切割方案是什么.

思路:因为长度的范围在[1.0, 100km]之间,所以不可能去枚举一个长度,只能去二分一个长度并且判断该N个绳子截取该长度能截取的个数.


/*************************************************************************
	> File Name: 1064-Cable-master.cpp
	> Author: 
	> Mail: 
	> Created Time: 2017年09月02日 星期六 22时58分53秒
************************************************************************/

#include <cstdio>
#include <cmath>
using namespace std;

#define MAX_N 10000
#define ESP 1e-8

int n, k;
double arr[MAX_N + 10];
double ans;

bool judge(double len) {
    int cnt = 0;
    for (int i = 0 ; i < n ; ++i) {
        cnt += (int)(arr[i] / len);
}
    return cnt >= k;
}
void solve() {
    // 一定注意是100KM
    double l = 0, r = 100000000, mid;
    // 使用这种方式来提高精确度
    for (int i = 0 ; i < 100 ; ++i) {
        mid = (l + r) / 2;
        if (judge(mid)) {
            l = mid;
        } else {
            r = mid;
        }
    }
    printf("%.2lf\n", floor(r * 100) / 100);
    return;
}
int main() {
    while (scanf("%d%d", &n, &k) != EOF) {
        for (int i = 0 ; i < n ; ++i) {
            scanf("%lf", arr + i);
            arr[i] += 0.005;
        }
        solve();
    }
    return 0;
}
posted @ 2017-09-03 00:31  ojnQ  阅读(135)  评论(0编辑  收藏  举报