题目描述
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
思路,很明显的二分查找,观察题目可得知三个条件
- 必须是单个完整的不能拼凑
- 形状是正方形,边长为整数
- 大小相同
那么我们可以二分可能的边长,然后套二分模板,写好函数就OK了。
首先是最常见的for循环遍历,如果切成边长为的切糕数量不够,那就输出就行了.
接着就是二分做法:
首先函数人人都会写,接下来套二分的板子
核心代码:
bool check(int x)
{
int sum = 0;
for (int i = 0; i < n; i++)
{
sum += (h[i] / x) * (w[i] / x);
}
return sum >= k;
}
这都把核心发出来了,还不赞赞?