[keda编程1189] 切切糕

题目描述

Mibbp去新疆玩,正好看到路边有人再卖切糕,Mibbp买了N块切糕请他的K个朋友吃,

其中第 i 块是 Hi×Wi 的方格组成的长方形。

为了公平起见,Mibpp需要从这N块切糕切出K块切糕分给他的朋友

切出的切糕需满足:

  • 必须是单个完整的不能拼凑
  • 形状是正方形,边长为整数
  • 大小相同

比如一块6×5的切糕可以切出6块2×2的切糕或者2块3×3的切糕

当然Mibbp的朋友们肯定希望能得到的切糕尽可能的大,你能帮Mibpp计算出最大的边

长是多少吗。

输入格式

第一行包含两个整数 N 和 K

以下 N行每行包含两个整数 Hi 和 Wi。

输入保证每位小朋友至少能获得一块 1×1 的切糕。

输出格式

输出切出的正方形切糕最大可能的边长。

数据范围

1≤N,K≤1e5,1≤Hi,Wi≤1e5

输入数据 1

2 10

6 5 

5 6

输出数据 1

2

思路,很明显的二分查找,观察题目可得知三个条件

  • 必须是单个完整的不能拼凑
  • 形状是正方形,边长为整数
  • 大小相同
     

那么我们可以二分可能的边长size,然后套二分模板,写好check函数就OK了。

首先是最常见的for循环遍历,如果切成边长为k的切糕数量不够,那就输出k - 1就行了.

接着就是二分做法:

首先check函数人人都会写,接下来套二分的板子

核心代码:
 

bool check(int x) 
{
    int sum = 0;
    for (int i = 0; i < n; i++) 
    {
        sum += (h[i] / x) * (w[i] / x);
    }
    return sum >= k;
}

这都把核心发出来了,还不赞赞?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值