蓝桥杯真题:分巧克力
蓝桥杯 2017 年省赛真题《分巧克力》的 Python 解法。
蓝桥杯 2017 年省赛真题:分巧克力。
题目链接:https://www.lanqiao.cn/problems/99/learning/(需要登录)。
题目大意
将 NN 块大小为 Hi×WiHi×Wi 的巧克力切出部分分给 KK 人,要求分给 KK 人的巧克力大小相等且都为边长是整数的正方形。求可能分法中每人巧克力的边长最大值(测试点保证答案不小于 11)。
数据范围
1≤N,K,Hi,Wi≤1051≤N,K,Hi,Wi≤105。
运行限制
- 时间限制:2s。
分析
Python
注意到数据范围上限都是 105105,可以猜测本题一解的时间复杂度为 O(NlogN)O(NlogN),继而联想到二分法。
那本题如何绕到二分上呢?先看选定不同的边长对分巧克力过程的影响。从题目中可知若记切出的巧克力的边长为 aa,能切出 bb 块满足题设条件的巧克力,那么所有边长小于 aa 的切法均能切出不少于 bb 块巧克力。换言之,若将考察范围内的边长排成一个序列,一定存在某个元素 aansaans,使得在它之前的边长以及它本身都是满足题设条件的分法,而在它之后的边长都不满足——这就说明这个序列可以视作有序的,其元素值仅能被划分到“满足条件的”和“不满足条件的”两类中,而我们则需要找到这两类元素的“分界线”——这正是二分法的一种典型应用。
此外,我们发现,对于给定的边长 aa 和大小为 Hi×WiHi×Wi 的巧克力,如果尽可能一块紧挨着一块切分,可以达到最大份数,具体数值为 ⌊Hia⌋⌊Wia⌋⌊Hia⌋⌊Wia⌋。这也说明判断某个边长是否满足题设条件的时间复杂度为 O(N)O(N)。结合上述二分的描述过程,此解法的时间复杂度恰好为 O(NlogN)O(NlogN)。
完整代码
Python
1 | import sys |
# Related Posts
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.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
# Recommend Posts
1.【ACG音乐分享】Ceui《今、歩き出す君へ》
2.使用 GPG 加密、解密和验证信息
3.【翻译】如何编写 Git 提交消息
4.Linux 时间操作及其同步
5.【实测】Python 和 C++ 下字符串查找的速度对比
6.Codeforces 1312B: Bogosort
1.【ACG音乐分享】Ceui《今、歩き出す君へ》
2.使用 GPG 加密、解密和验证信息
3.【翻译】如何编写 Git 提交消息
4.Linux 时间操作及其同步
5.【实测】Python 和 C++ 下字符串查找的速度对比
6.Codeforces 1312B: Bogosort