加载中...

分巧克力

分巧克力

蓝桥杯分巧克力

image-20230407195627577

image-20230407195642629

思路:

  1. 发现可以分的块数是由 (Hi / a) * (Wi / a) 得来,a 正方形边长(原理:" / "自动向下取整)
  2. 观察数据量,10^5 时间 2 s
  3. 可以用二分来枚举正方形可能的边数
  4. 写一个 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,两个测试点超时

posted @ 2023-04-07 20:11  ChuenSan  阅读(20)  评论(0编辑  收藏  举报