1 条题解
-
0
B. 汽车销售员卡尔 详细题解
1. 问题理解
- 有 种车型,第 种有 辆车。
- 每个顾客最多可以买 辆车,且必须来自不同车型。
- 目标:找到最少的顾客数量,使得所有车都能被卖出。
2. 关键观察
观察 1:单种车型的限制
由于每个顾客不能从同一车型买超过 辆车,所以对于第 种车型,它需要至少 个顾客(每个顾客最多贡献 辆)。
因此,最少顾客数至少为:
观察 2:总车辆数的限制
每个顾客最多买 辆车,所以总顾客数至少需要:
$$\left\lceil \frac{\sum_{i=1}^n a_i}{x} \right\rceil $$观察 3:下界
结合两个约束,最少顾客数至少为:
$$\text{lower} = \max\left( \max_i a_i,\ \left\lceil \frac{\sum a_i}{x} \right\rceil \right) $$
3. 充分性证明
这个下界是否总是可以达到?答案是是的。
证明思路(网格填充法)
设 $w = \max\left( \max_i a_i,\ \left\lceil \frac{S}{x} \right\rceil \right)$,其中 。
构造一个 的网格:
- 行代表 个顾客
- 列代表每个顾客最多可以买 辆车
将汽车按车型依次放入网格中,逐列填充(即先填第 列的所有行,再填第 列,以此类推):
- 对于第 种车型的 辆车,将它们放入网格中连续的空位中。
- 由于 ,每种车型的车都能放在同一列的不同行中(因为每列有 行)。
- 由于 ,网格的总格子数 ,所以所有车都能放下。
- 最终,每行(每个顾客)最多有 辆车,且每行的车都来自不同车型(因为同一车型的车都在同一列)。
因此, 个顾客就足够了。
4. 算法步骤
- 读入 和 。
- 读入数组 ,同时计算:
maximo=sum=
- 计算
sec= ,即 。 - 输出
max(maximo, sec)。
5. 时间复杂度
- 每个测试用例
- ,,完全可行
6. 示例验证
示例 1:
maximo = 3sum = 6,sec = ceil(6/2) = 3max(3, 3) = 3✅
示例 2:
maximo = 3sum = 6,sec = ceil(6/3) = 2max(3, 2) = 3✅
示例 3:
maximo = 9sum = 16,sec = ceil(16/3) = 6max(9, 6) = 9✅
示例 4:
maximo = 5sum = 25,sec = ceil(25/4) = 7max(5, 7) = 7✅
7. 二分查找的替代解法
虽然本题有直接公式,但也可以使用二分查找:
- 二分答案 ,判断是否能用 个顾客卖完所有车。
- 检查条件:
- (否则某种车型卖不完)
- (否则总容量不足)
- 时间复杂度 ,其中 是答案的上界。
8. 总结
最终公式:
$$\text{ans} = \max\left( \max_i a_i,\ \left\lceil \frac{\sum a_i}{x} \right\rceil \right) $$核心思想:
- 每个顾客最多买 辆,且不能买同型号两辆
- 答案至少是最大型号的数量
- 答案至少是总车辆数除以 的上取整
- 这两个下界同时满足时,构造可以证明其充分性
- 1
信息
- ID
- 6316
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者