洛谷原题链接
思路:对巧克力切的边长进行二分,二分条件为:块数大于等于K的边长中最大的长度。
import java.util.*;
public class Main{
static int N;
static int K;
static int H[];
static int W[];
public static void main(String args[]){
Scanner scan = new Scanner(System.in);
N = scan.nextInt();//N块巧克力
K = scan.nextInt();//K人
H = new int[100000];//巧克力长
W = new int[100000];//巧克力宽
for(int i = 0;i < N;i ++) {
H[i] = scan.nextInt();
W[i] = scan.nextInt();
}
int l = 1,r = 100000;//对巧克力边长进行二分,获取符合条件的最大的巧克力边长
while(l<r) {
int mid = (l+r+1)/2;//l=mid所以要上取整
if(getNum(mid) >= K) {
l = mid;//块数过多,说明边长过短
}else {
r = mid - 1;//块数不够分,说明边长过长
}
}
System.out.print(l);
scan.close();
}
//返回能切得几块长度为mid的巧克力
private static int getNum(int mid) {
int num = 0;
for(int i = 0;i < N;i ++) {
num += (H[i]/mid)*(W[i]/mid);
}
return num;
}
}