蓝桥杯真题:分巧克力
蓝桥杯 2017 年省赛真题《分巧克力》的 Python 解法。
蓝桥杯 2017 年省赛真题:分巧克力。
题目链接:https://www.lanqiao.cn/problems/99/learning/(需要登录)。
题目大意
将 $N$ 块大小为 $H_i\times W_i$ 的巧克力切出部分分给 $K$ 人,要求分给 $K$ 人的巧克力大小相等且都为边长是整数的正方形。求可能分法中每人巧克力的边长最大值(测试点保证答案不小于 $1$)。
数据范围
$1\leq N,K,H_i,W_i\leq10^5$。
运行限制
- 时间限制:2s。
分析
Python
注意到数据范围上限都是 $10^5$,可以猜测本题一解的时间复杂度为 $O(N\log N)$,继而联想到二分法。
那本题如何绕到二分上呢?先看选定不同的边长对分巧克力过程的影响。从题目中可知若记切出的巧克力的边长为 $a$,能切出 $b$ 块满足题设条件的巧克力,那么所有边长小于 $a$ 的切法均能切出不少于 $b$ 块巧克力。换言之,若将考察范围内的边长排成一个序列,一定存在某个元素 $a_\mathrm{ans}$,使得在它之前的边长以及它本身都是满足题设条件的分法,而在它之后的边长都不满足——这就说明这个序列可以视作有序的,其元素值仅能被划分到“满足条件的”和“不满足条件的”两类中,而我们则需要找到这两类元素的“分界线”——这正是二分法的一种典型应用。
此外,我们发现,对于给定的边长 $a$ 和大小为 $H_i\times W_i$ 的巧克力,如果尽可能一块紧挨着一块切分,可以达到最大份数,具体数值为 $\left\lfloor\dfrac{H_i}{a}\right\rfloor\left\lfloor\dfrac{W_i}{a}\right\rfloor$。这也说明判断某个边长是否满足题设条件的时间复杂度为 $O(N)$。结合上述二分的描述过程,此解法的时间复杂度恰好为 $O(N\log N)$。
完整代码
Python
1 | import sys |
1.Codeforces 1324B: Yet Another Palindrome Problem
2.Codeforces 363B: Fence & Rust for Competitive Programming
3.Codeforces 1327A: Sum of Odd Integers
4.LeetCode Problem 3: Longest Substring Without Repeating Characters
5.【文件格式探究】EP.2 WAV 音频文件格式
6.Codeforces 1399D: Binary String to Subsequences
7.Codeforces 1368B: Codeforces Subsequences
8.Codeforces 1430C: Numbers on Whiteboard
1.【ACG音乐分享】Ceui《今、歩き出す君へ》
2.使用 GPG 加密、解密和验证信息
3.【翻译】如何编写 Git 提交消息
4.Linux 时间操作及其同步
5.【实测】Python 和 C++ 下字符串查找的速度对比
6.Codeforces 1312B: Bogosort