第八届蓝桥杯省赛 C++ A/B组 - 分巧克力
创始人
2024-05-21 07:13:27
0

✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
📚专栏地址:蓝桥杯题解集合
📝原题地址:后缀表达式
📣专栏定位:为想参加蓝桥杯的小伙伴整理常考算法题解,祝大家都能取得理想成绩!
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

问题描述

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

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

小明一共有 N 块巧克力,其中第 i 块是 Hi×Wi 的方格组成的长方形。

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

切出的巧克力需要满足:

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

例如一块 6×5 的巧克力可以切出 6 块 2×2 的巧克力或者 2 块 3×3 的巧克力。

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

输入格式

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

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

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

输出格式

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

数据范围

1≤N,K≤105,
1≤Hi,Wi≤105

输入样例:

2 10
6 5
5 6

输出样例:

2

思路

题目要求切出来的巧克力需要大小一致,这就可能出现不同的切法,例如一块 6×5 的巧克力可以切出 6 块 2×2 的巧克力或者 2 块 3×3 的巧克力。

并且是要在找到满足切出 k 块的前提下,使切出的巧克力尽可能的大。我们可以用暴力法来做,去枚举每一个 k 值,直到找到满足所有条件的最大 k 值为止,但时间复杂度会很高,所以可以用二分法进行优化,对 k 值进行二分。

故存在一个临界值,在满足能切出 k 块的前提下能切出最大的巧克力,当边长小于这个临界值,一定能切出 k 块,但是巧克力不是最大的,当边长大于这个临界值,就不能切出 k 块,直接排除掉。故当边长大于等于临界值时,下边界就得等于 mid,使边长不断增大直到找到临界值。

注意,这里是使下边界 l=mid,而不是 l=mid+1。因为我们要使 k 值尽可能的大,所以只要 check(mid) 满足条件,则 mid 就是合法值,如果 mid 已经是最大值则 mid+1 会错过。反之不满足条件的话就让 r=mid-1,因为此时 mid 已经不是合法值了,故直接舍弃即可。

代码

#include 
using namespace std;int n, k;
const int N = 100010;
int h[N], w[N];bool check(int mid) {int res = 0;for (int i = 0; i < n; i++) {res += (h[i] / mid) * (w[i] / mid);if (res >= k)return true;}return false;
}int main() {scanf("%d%d", &n, &k);for (int i = 0; i < n; i++)scanf("%d%d", &h[i], &w[i]);int l = 1, r = 1e5; //至少能切出一块,所以下限为1上限为长宽最大值while (l < r) {int mid = l + r + 1 >> 1; //这里l=mid,所以mid计算要加1if (check(mid))l = mid; //因为是计算在满足k下,巧克力尽可能的大,所以这里下限要增大即长度增大elser = mid - 1;}printf("%d", l);return 0;
}

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...