アルゴリズムのプログラミング(Java)の#ロープカット問題

著作権:著者:xp_9512出典:CSDN著作権:この記事はブロガーオリジナル記事です、ボーエンのリンクを添付してください再現!オリジナル:https://blog.csdn.net/qq_40981804/article/details/89556812

問題の説明

そこNロープ、i番目の長さのLi、およびmは今、長いロープとして必要とされます。あなたはロープメートルのどのくらいの最長の長さを計算され、n型ロープ(スプライスされていない)をランダムにカットすることができますか?

入力説明:
最初の行は、このような意味のタイトル(1 <= N、M <ような2つの整数N、M、含ま = 100000)
二行目は、N個の整数を含む、ロープの対応する長さのN個(0 <L [Iを<10 ^ 9)
出力説明:
最長カットの長さを示す数値、小数点以下
の実施例1
の入力:
3 4
3 5 4。
出力:
2.50
説明:最初のルートと第切り出した文字列の一部、それぞれルート2.50ロープの長さ、ロープの第二わずか2つの2.50ロープの長さを切り出し、わずか4。

問題解決のためのアイデア

各ロープの長さを切断した後、所望の長さの要件を見つけるためにバイナリサーチを使用して、0からMAX(コードの元の長さ)の間でなければなりません

問題解決のためのコード

public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        //现有绳子的数量为n
        int n = sc.nextInt();
        //需要剪成m根绳子
        int m = sc.nextInt();
        //现在每根绳子的长度
        int[] length = new int[n];
        for(int i = 0;i < n;i++){
            length[i] = sc.nextInt();
        }
        //找到最长的那根绳子,截取后每根绳子的长度不可能大于它
        int max = length[0];
        for (int i = 1; i < n; i++) {
            if (max < length[i]) max = length[i];
        }
        //二分查找法
        double high = max;
        double low = 0;
        double mid = 0;
        //计算按照最大长度裁剪得到的绳子根数
        int count ;
        //1.0E-6是运算的精度
        while (high - low > 1.0E-6){
            mid = (low + high) / 2;
            count = checkMax(length, mid);
            //如果计算出的结果小于m,说明最大长度大了,
            if (count < m)
                high = mid;
            //如果计算出的结果大于m,说明最大长度小了,
            else
                low = mid;
        }
        System.out.println(String.format("%.2f",mid));
    }
    private static int checkMax(int[] a, double maxLength) {
        int count = 0;
        for (int i = 0; i < a.length; i++) {
            Double s = a[i] / maxLength;
            int s1 = s.intValue();
            count += s1;
        }
        return count;
    }

}

おすすめ

転載: blog.csdn.net/qq_40981804/article/details/89556812