1 条题解
-
0
问题分析
我们有 个人分享一个长度为 的馕,馕被分成 段,每段 1 厘米,有不同的口味。第 个人对第 种口味的快乐度系数是 。
我们需要将馕切成 段,分配给 个人,使得每个人获得的快乐度不少于他们独享整个馕的 。
关键思路
1. 快乐度计算
设第 个人吃整个馕的总快乐度为: 公平性要求:第 个人分配的快乐度 。
2. 连续分配的性质
由于馕是连续的,我们可以将问题转化为在 区间上找 个分割点。
对于第 个人,如果我们知道他要吃区间 ,那么他的快乐度是:
$$\text{joy}_i(a,b) = \sum_{j=\lceil a \rceil}^{\lfloor b \rfloor - 1} V_{i,j} + V_{i,\lfloor b \rfloor} \cdot (b - \lfloor b \rfloor) + V_{i,\lceil a \rceil} \cdot (\lceil a \rceil - a) $$3. 核心观察:相对进度
定义第 个人在位置 的累积快乐度比例:
即 表示如果第 个人吃到位置 ,他获得了自己总快乐度的多大比例。
关键性质:对于任意 ,存在位置 使得 (由于连续性)。
4. 构造算法
我们可以按以下步骤构造解:
计算总快乐度:对于每个人 ,计算
确定分割点:
设当前剩余人员集合为
对于 到 :
找到最小的 ,使得存在某人 满足
选择满足条件的 中 增长最慢的(即最"贪心"的人)
将 作为第 个分割点,将 分配到这个区间
从 中移除
分配最后一个人:将最后剩余的人分配给最后一个区间
5. 算法正确性
正确性证明:
对于第 个区间 (设 ),分配给的人 满足:
因为 ,而 (由构造保证)
因此,第 个人获得的快乐度比例至少为 ,即快乐度
对于最后一个人 ,由于 ,且 ,所以他在最后一个区间的快乐度比例
6. 数值实现
由于题目要求输出分数形式 ,我们可以:
将每个位置 表示为有理数
对于 ,我们需要解:
$$\frac{\sum_{j=1}^{\lfloor x \rfloor} V_{i,j} + V_{i,\lceil x \rceil} \cdot (x - \lfloor x \rfloor)}{s_i} =t $$设 ,其中 ,,则:
$$α=\frac{\alpha = \frac{t \cdot S_i - \sum_{j=1}^{m} V_{i,j}}{V_{i,m+1}}}{v_{i,m}+1} $$因此 可以表示为有理数。
算法步骤
详细算法:
计算 对于
初始化剩余人员集合 ,分割点列表 ,分配方案
对于 到 :
对于每个 ,计算最小的 使得
选择 ,对应的
将 x^ 加入 ,将 p^ 加入 ,从 中移除
将剩余的唯一人员加入
输出分割点 (表示为分数)和分配方案
复杂度分析
计算 :
对于每个 ,计算所有剩余人员的 :
总复杂度:,对于 可接受
示例验证
以样例1为例:
,
: 时 , 时 ,选择较小的
输出 ,分配 ,
总结
这道题的核心在于利用连续性保证公平分配的存在性,通过贪心选择"最急需"的人来确保所有人都能满足 的快乐度要求。算法构造性地证明了解的存在,并给出了有效的构造方法。
- 1
信息
- ID
- 4286
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 9
- 已通过
- 1
- 上传者