著作権:著者: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;
}
}