1 条题解

  • 0
    @ 2026-9-3 10:46:54

    分数游戏(困难版)题解

    思路

    令 f(n,m)f(n,m) 表示 k=1k=1 时的最优最终分数。Alice 在一回合中平衡 Bob 选择加法和减法后的两个结果,可得到相邻状态取平均值的递推。困难版不能存下完整的二维状态表,需要把递推化为组合数公式。

    做法

    子任务 1

    当 n≤20n\le20 时,不记忆化地展开 Bob 每回合的两种选择。边界为 f(n,0)=0f(n,0)=0 和 f(n,n)=nf(n,n)=n,内部状态递归计算两个后继的平均值,复杂度为 O(2n)O(2^n)。

    子任务 2

    按回合数从小到大计算

    f(n,m)=f(n−1,m−1)+f(n−1,m)2.f(n,m)=\frac{f(n-1,m-1)+f(n-1,m)}2.

    使用滚动数组后,每组复杂度为 O(nm)O(nm),在 ∑n≤2000\sum n\le2000 时可以通过。

    满分算法

    记相邻差分 d(n,m)=f(n,m)−f(n,m−1)d(n,m)=f(n,m)-f(n,m-1)。由递推可证明

    d(n,m)=2−(n−1)∑i=0m−1(ni).d(n,m)=2^{-(n-1)}\sum_{i=0}^{m-1}\binom ni.

    再次对 mm 求前缀和,得到

    f(n,m)=2−(n−1)∑i=0m−1(m−i)(ni).f(n,m)=2^{-(n-1)}\sum_{i=0}^{m-1}(m-i)\binom ni.

    预处理阶乘、逆阶乘和二的逆幂,即可在 O(m)O(m) 时间回答一组询问。因为 m≤nm\le n 且所有测试组的 ∑n≤106\sum n\le10^6,总循环次数也是 O(106)O(10^6)。最终答案乘以 kk。

    正确性证明

    在内部状态 0<m<n0<m<n,设 Alice 当前选择 xx。Bob 选择加法后的值为

    x+f(n−1,m−1),x+f(n-1,m-1),

    选择减法后的值为

    −x+f(n−1,m).-x+f(n-1,m).

    Alice 的最优选择令两式相等,因此状态值恰为两个后继状态的平均值。边界 m=0m=0 时 Alice 只能保证零;边界 m=nm=n 时 Bob 每回合都必须加,Alice 每回合选择一,故值为 nn。于是上述递推正确。

    由递推对相邻 mm 作差,并结合帕斯卡恒等式,可归纳得到 d(n,m)d(n,m) 的二项式前缀和表达式。再把 d(n,1),…,d(n,m)d(n,1),\ldots,d(n,m) 相加,每个 (ni)\binom ni 恰出现 m−im-i 次,便得到满分公式。因此算法输出 kf(n,m)k f(n,m),正是原游戏的最优最终分数。

    复杂度

    预处理时间和空间均为 O(N)O(N),其中 N=max⁡nN=\max n。所有询问的总时间复杂度为 O(N+∑m)O(N+\sum m),空间复杂度为 O(N)O(N)。

    • 1

    信息

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