1 条题解

  • 0
    @ 2025-12-8 21:48:53

    题意概述

    我们有一个 n×nn \times n 的棋盘:

    • 每个格子有颜色(1 红色 / 2 黄色)和分数 fi,jf_{i,j}(可以为负)。
    • 左上角 (1,1)(1,1) 分数为 00

    三个机器人 A,B,CA,B,C(1,1)(1,1) 出发,每步可以 向下或向右 跳跃。
    初始跳跃距离为 dd
    如果花费 gg 金币,跳跃距离可以变为 [max(1,dg),d+g][\max(1, d-g), d+g] 之间的整数。

    跳跃规则:

    1. 跳到格子得到该格子分数。
    2. 如果跳之前和跳之后的格子颜色相同,额外获得 11 分。
    3. 可以在任意时刻结束游戏(不一定要到右下角)。
    4. 三个机器人独立,路线可以相同。

    最终得分:

    $$S = A \times 20\% + B \times 30\% + C \times 50\%. $$

    获得 S\lfloor S \rfloor RMB。


    图书馆与读者部分

    图书馆有 mm 本书,编码为 cic_i
    qq 个读者,每人:

    • 需求码长度 lil_i
    • 需求码 bib_i(无前导 0)
    • 如果借不到书,需要 wiw_i RMB 说服

    定义:一个读者被满足,当且仅当图书馆中有某本书 cjc_j 的后 lil_i 位等于 bib_i

    如果读者不被满足,就需要花费 wiw_i RMB 去说服。
    图书馆的总说服费用 = 所有不被满足的读者的 wiw_i 之和。


    目标

    我们需要通过花费金币 gg 来调整机器人跳跃范围,从而让三个机器人可以走出足够高的得分,使得获得的 RMB \ge 图书馆的总说服费用。
    求最小的 gg,如果无解输出 1-1


    问题分解

    第一步:计算图书馆的总说服费用

    对于每个读者 ii,检查是否有 cjmod10li=bic_j \bmod 10^{l_i} = b_i
    如果没有,则需要 wiw_i RMB。
    设总说服费用为 WW

    我们需要 SW\lfloor S \rfloor \ge W


    第二步:计算三个机器人的最大总分 SS

    Amax(g)A_{\max}(g) 表示在跳跃范围 [max(1,dg),d+g][\max(1, d-g), d+g] 下,机器人 AA 能获得的最大分数(可以随时结束)。
    类似地 Bmax(g)B_{\max}(g)Cmax(g)C_{\max}(g) 独立最大。

    那么:

    $$S_{\max}(g) = 0.2 \times A_{\max}(g) + 0.3 \times B_{\max}(g) + 0.5 \times C_{\max}(g). $$

    因为三个机器人独立,且路线可以相同,所以它们可以各自选择自己的最优路径(不一定要相同),因此 Smax(g)S_{\max}(g) 就是三者独立最大值的加权和。

    所以我们要判断是否存在 gg 使得 Smax(g)W\lfloor S_{\max}(g) \rfloor \ge W


    第三步:对单个机器人求最大得分

    这是一个 带权最大路径 问题,但特殊点:

    1. 跳跃距离是一个范围 [L,R][L, R],其中 L=max(1,dg),R=d+gL = \max(1, d-g), R = d+g
    2. 每次只能向下或向右。
    3. 路径可以随时结束(停在某个格子)。
    4. 额外奖励:如果相邻两格子颜色相同,额外 +1+1

    dp[i][j]dp[i][j] 表示到达 (i,j)(i,j) 的最大得分(可以在 (i,j)(i,j) 结束)。

    状态转移:

    • 可以从 (ik,j)(i-k, j) 向下跳 kk 步到达 (i,j)(i,j),其中 LkRL \le k \le R1ikn1 \le i-k \le n
    • 可以从 (i,jk)(i, j-k) 向右跳 kk 步到达 (i,j)(i,j),其中 LkRL \le k \le R1jkn1 \le j-k \le n
    • 转移时加上 f[i][j]f[i][j],并且如果颜色与上一步格子相同,额外 +1+1

    初始化 dp[1][1]=0dp[1][1] = 0(因为 f[1][1]=0f[1][1]=0,且没有上一步)。

    最终该机器人最大得分 = max1i,jndp[i][j]\max_{1\le i,j\le n} dp[i][j](因为可以随时结束)。


    第四步:复杂度与优化

    直接 DP 复杂度 O(n3)O(n^3)(因为每个点要从 O(n)O(n) 个可能的前驱转移),nn 最大 10001000 会超时。

    注意到跳跃范围 [L,R][L,R] 长度是 2g+12g+1,如果 gg 较小,那么转移来源是 O(g)O(g) 的,不是 O(n)O(n)

    我们可以优化:
    对于每个 (i,j)(i,j),需要检查:

    • 从上方 iki-k 来:k[L,R]k \in [L,R],且 ik1i-k \ge 1
    • 从左方 jkj-k 来:k[L,R]k \in [L,R],且 jk1j-k \ge 1

    因此我们可以维护一个 滑动窗口最大值 结构:

    • 对每一列 jj,维护从上到下的 dp[i][j]dp[i][j] 在窗口长度 RL+1R-L+1 内的最大值。
    • 对每一行 ii,维护从左到右的 dp[i][j]dp[i][j] 在窗口长度 RL+1R-L+1 内的最大值。

    这样转移可以 O(1)O(1) 得到最优前驱。

    总复杂度 O(n2)O(n^2),可以接受。


    第五步:搜索最小的 gg

    gg 范围:

    • 下界 00(不花钱)。
    • 上界:由于跳跃距离不能超过 nnd+gnd+g \le ndg1d-g \ge 1,所以 gn1g \le n-1

    我们可以在 [0,n1][0, n-1] 范围内 二分 gg

    • 对每个 gg 计算 Amax(g),Bmax(g),Cmax(g)A_{\max}(g), B_{\max}(g), C_{\max}(g)
    • 计算 Smax(g)S_{\max}(g),判断是否 Smax(g)W\lfloor S_{\max}(g) \rfloor \ge W

    二分 gg 的可行性:

    • 如果 gg 增大,跳跃范围 [L,R][L,R] 变宽,可达的格子增多,得分不会减少(因为可以走原来的路径,或者走更优路径)。
      所以 Smax(g)S_{\max}(g) 关于 gg 单调不减,可以二分。

    第六步:无解判断

    如果在 g=n1g = n-1(最大可能)时,Smax(g)S_{\max}(g) 仍不足以 W\ge W,则输出 1-1


    算法步骤总结

    1. 计算总说服费用 WW
      对每个读者检查图书馆是否有匹配的书(用哈希或字典树后缀匹配),累加未满足读者的 wiw_i

    2. 二分 gg
      下界 00,上界 n1n-1

    3. 对给定的 gg

      • 计算 L=max(1,dg)L = \max(1, d-g), R=d+gR = d+g
      • 用滑动窗口 DP 计算 Amax(g),Bmax(g),Cmax(g)A_{\max}(g), B_{\max}(g), C_{\max}(g)(三者独立,但计算方法相同,可以只算一次最大得分,因为地图一样,只是机器人独立)。
      • 计算 Smax(g)S_{\max}(g) 并判断是否 W\ge W
    4. 输出最小 gg1-1


    样例解析

    样例 1

    n=5,d=2n=5, d=2,计算得 W=30W=30
    g=0g=0 时跳跃范围 [2,2][2,2],可能无法得到足够高分。
    g=1g=1 时跳跃范围 [1,3][1,3],可以走出 A=34,B=32,C=30A=34, B=32, C=30S=31.430S=31.4 \ge 30,所以 g=1g=1 可行。

    样例 2

    棋盘分数有很多负值,即使 gg 最大也无法达到 WW,输出 1-1


    复杂度分析

    • 计算 WWO(m+qlen)O(m + q \cdot \text{len}),其中 len9\text{len} \le 9,可以 O(1)O(1) 比较。
    • 每个 gg 的 DP:O(n2)O(n^2),用滑动窗口。
    • 二分 ggO(logn)O(\log n) 次检查。

    总复杂度 O(n2logn)O(n^2 \log n)n1000n \le 1000 可过。


    关键点

    1. 图书馆部分只是用来计算说服费用 WW,与棋盘无关。
    2. 三个机器人独立,可以分别走最优路径,因此 SmaxS_{\max} 是各自最大值的加权和。
    3. 跳跃范围单调性 使得可以二分 gg
    4. DP 优化 用滑动窗口维护列和行的最大值,将复杂度从 O(n3)O(n^3) 降为 O(n2)O(n^2)

    这样就能高效求解。

    • 1

    信息

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