侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 674 篇文章
  • 累计创建 128 个标签
  • 累计收到 20 条评论

目 录CONTENT

文章目录

【二分查找】分巧克力【蓝桥杯】

GabrielxD
2023-02-05 / 0 评论 / 0 点赞 / 96 阅读 / 554 字
温馨提示:
本文最后更新于 2023-02-05,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目

1227. 分巧克力 - AcWing题库

分巧克力 - 蓝桥云课


儿童节那天有 KK 位小朋友到小明家做客。

小明拿出了珍藏的巧克力招待小朋友们。

小明一共有 NN 块巧克力,其中第 ii 块是 Hi×WiH_i \times W_i 的方格组成的长方形。

为了公平起见,小明需要从这 NN 块巧克力中切出 KK 块巧克力分给小朋友们。

切出的巧克力需要满足:

  1. 形状是正方形,边长是整数
  2. 大小相同

例如一块 6×56 \times 5 的巧克力可以切出 662×22 \times 2 的巧克力或者 223×33 \times 3 的巧克力。

当然小朋友们都希望得到的巧克力尽可能大,你能帮小明计算出最大的边长是多少么?

输入格式

第一行包含两个整数 NNKK

以下 NN 行每行包含两个整数 HiH_iWiW_i

输入保证每位小朋友至少能获得一块 1×11 \times 1 的巧克力。

输出格式

输出切出的正方形巧克力最大可能的边长。

数据范围

1N,K1051 \le N,K \le 10^5 ,
1Hi,Wi1051 \le H_i,W_i \le 10^5

输入样例:

2 10
6 5
5 6

输出样例:

2

解题

方法一:二分查找

思路

二分最大可能的边长。

二分查找 - 左边界

代码

import java.util.*;
import java.io.*;

public class Main {
    static int n, k;
    static int[][] chocos;
    static boolean check(int m) {
        int cnt = 0;
        for (int[] choco : chocos) {
            if ((cnt += (choco[0] / m) * (choco[1] / m)) >= k) return true;
        }
        return cnt >= k;
    }

    public static void main(String[] args) throws IOException {
        StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        in.nextToken();
        n = (int) in.nval;
        in.nextToken();
        k = (int) in.nval;
        int l = 1, r = 0;
        chocos = new int[n][2];
        for (int i = 0; i < n; ++i) {
            in.nextToken();
            int h = (int) in.nval;
            in.nextToken();
            int w = (int) in.nval;
            r = Math.max(r, Math.min(h, w));
            chocos[i][0] = h;
            chocos[i][1] = w;
        }
        while (l < r) {
            int m = l + r + 1 >> 1;
            if (check(m)) l = m;
            else r = m - 1;
        }
        System.out.println(l);
    }
}
0

评论区