分巧克力
分巧克力
思路:
- 发现可以分的块数是由 (Hi / a) * (Wi / a) 得来,a 正方形边长(原理:" / "自动向下取整)
- 观察数据量,10^5 时间 2 s
- 可以用二分来枚举正方形可能的边数
- 写一个 check 函数,对长度合理的边进行处理
public class N99 {
static int N = 100010;// 多开10个
static int n;
static int[] w;
static int[] h;
static int k;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
k = scanner.nextInt();
h = new int[n + 1];
w = new int[n + 1];
for (int i = 1; i <= n; i++) {
h[i] = scanner.nextInt();
w[i] = scanner.nextInt();
}
int l = 1;
int r = 100000;
int res = 0;// 这一个必须要有,因为 mid 不一定是最终答案,mid 的值是一直在变化的
while (l <= r) {// 用二分法枚举每一个正方形边的可能性
int mid = l + (r - l) / 2;
if (check(mid)) {// 看右边是否有更大的边的可能性
res = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
System.out.println(res);
}
/**
* 判断长为 a 的边是否符合条件,也就是能否够小朋友们分
*/
static boolean check(int a) {// 边长为 a 的正方形
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += (h[i] / a) * (w[i] / a);
}
if (sum >= k) {
return true;
}
return false;
}
}
说明:
未AC,两个测试点超时