题目地址
题意:
给你n个钢管,要切成至少k个相同的数,现在让你求如何切割最大。
思路:
分析可知,比当前值还小的都不要,比当前值大的也不要。
答案区间符合二分的性质。
二分搜索答案。在[l ,r]内搜索。当循环结束时,答案即为r或l - 1.
二分理解:
mid = =(l + r) >>> 1;>>> 当存在两个很大的数时,防止数据溢出。
或者写成(l - (l + r) / 2);
如果都是闭区间就加等于号,然后你想清楚你要找的是符合条件的最后一个,还是不符合条件的第一个,这儿决定着你 l 和 r 怎么变
如果觉得犹豫,一个好的方法是带点例子去试,三个数的,两个数的,尤其是两个数的,这样可以避免写出死循环 1e6的数据可以缩小到20次运算。
package jisuanke;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
int k = cin.nextInt();
int a[] = new int[10010];
for(int i = 0; i < n;i++) {
a[i] = cin.nextInt();
}
int l = 0;
int r = 100000000 + 1;
while(l <= r) {
int mid = (l + r) >>> 1;
int sum = 0;
for(int i = 0;i < n;i++) {
sum += a[i] / mid;
}
if(sum >= k)l = mid + 1;
else {
r = mid - 1;
}
}
System.out.println(r);
}
}