AcWing 1227. 分巧克力

Problem: AcWing 1227. 分巧克力

思路

这是一个二分查找的问题。我们需要找到最大的边长m,使得我们可以从巧克力板中切出至少k块边长为m的正方形巧克力。我们可以通过二分查找来找到这个最大的边长。我们从最小边长1开始,到最大边长r(r为所有巧克力板的最大边长),然后在这个范围内进行二分查找。对于每一个中间值,我们检查是否可以从巧克力板中切出至少k块边长为m的正方形巧克力。如果可以,我们就将左边界移动到中间值的右边,否则我们将右边界移动到中间值的左边。最后,我们找到的右边界就是我们需要的最大边长。

解题方法

我们使用二分查找的方法来解决这个问题。对于每一个中间值,我们计算每块巧克力板可以切出多少块边长为m的正方形巧克力,然后将这些数量相加。如果总数量大于等于k,那么我们就知道这个边长是可以的,我们需要增大边长。如果总数量小于k,那么我们就知道这个边长是不够的,我们需要减小边长。

复杂度

时间复杂度:

二分查找的时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn),对于每一个中间值,我们需要 O ( n ) O(n) O(n)的时间来计算每块巧克力板可以切出多少块边长为m的正方形巧克力,所以总的时间复杂度为 O ( n log ⁡ n ) O(n\log n) O(nlogn)

空间复杂度:

我们只需要 O ( n ) O(n) O(n)的空间来存储每块巧克力板的长和宽,所以空间复杂度为 O ( n ) O(n) O(n)

Code

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

public class Main{
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
	static StreamTokenizer sr = new StreamTokenizer(in);
	static int MAXN = (int) (1e5 + 10);
	static int[][] arr = new int[MAXN][2];
	static int n, k;

	public static void main(String[] args) throws IOException {
		n = nextInt();
		k = nextInt();
		int l = 1, r = 0, ans = 0;
		for (int i = 0; i < n; i++) {
			arr[i][0] = nextInt();
			arr[i][1] = nextInt();
			r = Math.max(arr[i][0], arr[i][1]);
		}
		while (l <= r) {
			int m = (l + r) >> 1;
			if (check(m)) {
				ans = m;
				l = m + 1;
			} else {
				r = m - 1;
			}
		}
		out.println(ans);
		out.flush();

	}

	private static boolean check(int m) {
		// TODO Auto-generated method stub
		int ans = 0;
		for(int i = 0; i < n; i++) {
			ans += (arr[i][0] / m) * (arr[i][1] / m);
		}
		if(ans >= k) {
			return true;
		}
		return false;
	}

	private static int nextInt() throws IOException {
		sr.nextToken();
		return (int) sr.nval;
	}

}

相关推荐

  1. AcWing 1227. 巧克力

    2024-03-11 10:26:03       40 阅读
  2. 问题 F: 巧克力

    2024-03-11 10:26:03       58 阅读
  3. 【二分算法】巧克力

    2024-03-11 10:26:03       43 阅读
  4. 巧克力(二分实现C++)

    2024-03-11 10:26:03       50 阅读
  5. 巧克力---二分枚举

    2024-03-11 10:26:03       41 阅读
  6. AcWing 1221. 四平方和

    2024-03-11 10:26:03       34 阅读
  7. 蓝桥杯备战10.巧克力

    2024-03-11 10:26:03       35 阅读
  8. P8647 [蓝桥杯 2017 省 AB] 巧克力

    2024-03-11 10:26:03       66 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-11 10:26:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-11 10:26:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-11 10:26:03       82 阅读
  4. Python语言-面向对象

    2024-03-11 10:26:03       91 阅读

热门阅读

  1. C++ 栈OJ

    C++ 栈OJ

    2024-03-11 10:26:03      44 阅读
  2. 卷积神经网络

    2024-03-11 10:26:03       44 阅读
  3. git pull 跟 git pull origin master的区别

    2024-03-11 10:26:03       39 阅读
  4. 佛祖保佑,永不宕机,永无BUG

    2024-03-11 10:26:03       44 阅读
  5. BUG:Enigma Virtual Box打包.net独立程序不正常

    2024-03-11 10:26:03       42 阅读
  6. 判断cursor是否为空

    2024-03-11 10:26:03       49 阅读
  7. CocoaPods 安装使用

    2024-03-11 10:26:03       47 阅读
  8. 解读电影级视频生成模型 MovieFactory

    2024-03-11 10:26:03       52 阅读