二分法的应用:POJ1064 Cable master

/*
POJ1064 Cable master

时间限制: 1000MS        内存限制: 10000K
提交总数: 58217        接受: 12146
描述

Wonderland的居民已经决定举办地区性编程比赛。评委会自愿并承诺举办有史以来最诚实的比赛。决定使用“星形”拓扑结构为参赛者连接计算机 - 即将它们全部连接到单个中央集线器。为了组织一场真正诚实的比赛,评审委员会负责人决定将所有参赛选手均匀地放在距离该比赛中心的地方。
为了购买网线,评审委员会联系了当地的网络解决方案供应商,要求为他们出售具有相同长度的特定数量的电缆。评审委员会希望电缆尽可能长地让参赛者尽可能远离彼此。
公司的Cable Master被分配到该任务。他知道长达一厘米的股票中的每根电缆的长度,并且他可以以厘米精度切割它们,告诉他必须切割的碎片的长度。然而,这一次,这个长度还不知道,而且有线电视大师完全不解。
您需要编写一个程序来帮助Cable Master,该程序将确定可从电缆中切断的电缆段的最大可能长度,以获得指定数量的段。
输入

输入文件的第一行包含两个整数n和k,用空格分隔。N(1 = N = 10000)是库存中的电缆数量,K(1 = K = 10000)是请求数量。第一行后面是N行,每行一个数字,以米为单位指定库存中每条电缆的长度。所有电缆长度至少1米,最长100公里。输入文件中的所有长度都以厘米精度写入,精确到小数点后两位数字。
产量

在输出文件中写出Cable Master可能从电缆中切断的部件的最大长度(以米为单位)以获取所需数量的部件。数字必须以厘米精度写入,精确到小数点后两位数字。
如果无法削减所请求的每件至少一厘米长的件数,则输出文件必须包含单个数字“0.00”(不含引号)。
示例输入

4 11
8.02
7.43
4.57
5.39
示例输出

2.00

来源

东北欧洲2001
 */

import java.util.Scanner;

public class Main {
    static int N, K;
    static double[] a;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        K = sc.nextInt();
        a = new double[N];
        for (int i = 0; i < N; i++)
            a[i] = sc.nextDouble();
        sc.close();
        double low = -1, high = 100001;
        while (high - low > 0.001) {
            double mid = (low + high) / 2;
            if (C(mid)) {
                low = mid;
            } else {
                high = mid;
            }
        }
        if (high < 0.01)
            System.out.println("0.00");
        else
            System.out.println(String.format("%.2f", (int) (high * 100) / 100.0));
    }

    static boolean C(double X) {
        int count = 0;
        for (int i = 0; i < N; i++)
            count = count + (int) (a[i] / X);
        return count >= K;
    }
}

 

posted @ 2018-03-28 13:31  忧伤的小毛驴  阅读(193)  评论(0编辑  收藏  举报