1 条题解

  • 0
    @ 2025-10-27 18:12:08

    问题分析

    我们有 NN 个人分享一个长度为 LL 的馕,馕被分成 LL 段,每段 1 厘米,有不同的口味。第 ii 个人对第 jj 种口味的快乐度系数是 Vi,jV_{i,j}

    我们需要将馕切成 NN 段,分配给 NN 个人,使得每个人获得的快乐度不少于他们独享整个馕的 1N\frac{1}{N}


    关键思路

    1. 快乐度计算

    设第 ii 个人吃整个馕的总快乐度为: Si=j=1LVi,jS_i = \sum_{j=1}^L V_{i,j} 公平性要求:第 ii 个人分配的快乐度 SiN\ge \frac{S_i}{N}

    2. 连续分配的性质

    由于馕是连续的,我们可以将问题转化为在 [0,L][0, L] 区间上找 N1N-1 个分割点。

    对于第 ii 个人,如果我们知道他要吃区间 [a,b][a, b],那么他的快乐度是:

    $$\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. 核心观察:相对进度

    定义第 ii 个人在位置 xx 的累积快乐度比例:

    fi(x)=i个人在区间[0,x]上的快乐度/sif_i(x) = 第 i 个人在区间 [0, x] 上的快乐度/s_i

    fi(x)f_i(x) 表示如果第 ii 个人吃到位置 xx,他获得了自己总快乐度的多大比例。

    关键性质:对于任意 t[0,1]t \in [0,1],存在位置 xx 使得 fi(x)=tf_i(x) = t(由于连续性)。

    4. 构造算法

    我们可以按以下步骤构造解:

    计算总快乐度:对于每个人 ii,计算 Si=j=1LVi,jS_i = \sum_{j=1}^L V_{i,j}

    确定分割点:

    设当前剩余人员集合为 PP

    对于 k=1k = 1N1N-1

    找到最小的 xkx_k,使得存在某人 pPp \in P 满足 fp(xk)=kNf_p(x_k) = \frac{k}{N}

    选择满足条件的 ppfp(xk)f_p(x_k) 增长最慢的(即最"贪心"的人)

    xkx_k 作为第 kk 个分割点,将 pp 分配到这个区间

    PP 中移除 pp

    分配最后一个人:将最后剩余的人分配给最后一个区间 [xN1,L][x_{N-1}, L]

    5. 算法正确性

    正确性证明:

    对于第 kk 个区间 [xk1,xk][x_{k-1}, x_k](设 x0=0,xN=Lx_0=0, x_N=L),分配给的人 pp 满足:

    fp(xk)fp(xk1)1Nf_p(x_k)-f_p(x_k-1) \le \frac{1}{N}

    因为 fp(xk)=kNf_p(x_k) = \frac{k}{N},而 fp(xk1)k1Nf_p(x_{k-1}) \le \frac{k-1}{N}(由构造保证)

    因此,第 pp 个人获得的快乐度比例至少为 1N\frac{1}{N},即快乐度 SpN\ge \frac{S_p}{N}

    对于最后一个人 qq,由于 fq(L)=1f_q(L) = 1,且 fq(xN1)N1Nf_q(x_{N-1}) \le \frac{N-1}{N},所以他在最后一个区间的快乐度比例 1N\ge \frac{1}{N}

    6. 数值实现

    由于题目要求输出分数形式 AiBi\frac{A_i}{B_i},我们可以:

    将每个位置 xx 表示为有理数

    对于 fi(x)=tf_i(x) = t,我们需要解:

    $$\frac{\sum_{j=1}^{\lfloor x \rfloor} V_{i,j} + V_{i,\lceil x \rceil} \cdot (x - \lfloor x \rfloor)}{s_i} =t $$

    x=m+αx = m + \alpha,其中 m=xm = \lfloor x \rfloor0α<10 \le \alpha < 1,则:

    $$α=\frac{\alpha = \frac{t \cdot S_i - \sum_{j=1}^{m} V_{i,j}}{V_{i,m+1}}}{v_{i,m}+1} $$

    因此 x=m+αx = m + \alpha 可以表示为有理数。


    算法步骤

    详细算法:

    计算 Si=j=1LVi,jS_i = \sum_{j=1}^L V_{i,j} 对于 i=1,,Ni=1,\dots,N

    初始化剩余人员集合 P=1,,NP = {1,\dots,N},分割点列表 X=[]X = [],分配方案 assign=[]assign = []

    对于 k=1k = 1N1N-1

    对于每个 pPp \in P,计算最小的 xpx_p 使得 fp(xp)=kNf_p(x_p) = \frac{k}{N}

    选择 x=minpPxpx^* = \min_{p \in P} x_p,对应的 p=argminpPxpp^* = \arg\min_{p \in P} x_p

    x^ 加入 XX,将 p^ 加入 assignassign,从 PP 中移除 pp^*

    将剩余的唯一人员加入 assignassign

    输出分割点 XX(表示为分数)和分配方案 assignassign


    复杂度分析

    计算 SiS_iO(NL)O(NL)

    对于每个 kk,计算所有剩余人员的 xpx_pO(NL)O(NL)

    总复杂度:O(N2L)O(N^2L),对于 N,L2000N,L \le 2000 可接受


    示例验证

    以样例1为例:

    S1=20S_1 = 20, S2=14S_2 = 14

    k=1k=1f1(x)=0.5f_1(x)=0.5x=2.8x=2.8f2(x)=0.5f_2(x)=0.5x2.57x≈2.57,选择较小的 x=2.8x=2.8

    输出 145=2.8\frac{14}{5}=2.8,分配 P1=2P_1=2P2=1P_2=1


    总结

    这道题的核心在于利用连续性保证公平分配的存在性,通过贪心选择"最急需"的人来确保所有人都能满足 1N\frac{1}{N} 的快乐度要求。算法构造性地证明了解的存在,并给出了有效的构造方法。

    • 1

    信息

    ID
    4286
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    9
    已通过
    1
    上传者