20 S2模拟赛T2 六明文 题解

六明文

题面

在六明文游戏中,玩家胜利的条件是:在 \(t\) 回合内累计投入至少 \(s\) 点科技点到胜利槽。

\(n\) 个科技,初始只有第一个科技解锁,科技需要按照顺序解锁,也就是第 \(i\) 个科技解锁,当且仅当前 \(i - 1\) 个科技已经完成。

每个科技要想完成都需要一定的科技点,玩家也可以投入一定数量的生产力去触发 “尤里卡” 时刻,使得解锁科技所需的科技点减少,每个科技的 “尤里卡时刻” 只能触发一次。完成科技后,玩家每回合获得的科技点会增加。

每个科技有四个参数:

  • \(a_i\):完成此科技所需的科技点
  • \(k_i\):完成此科技后每回合科技点的增量
  • \(b_i\):触发尤里卡所需的生产力
  • \(c_i\):触发尤里卡可减少的科技点, \(0 \le c_i < a_i\)

每回合玩家都会获得科技点和生产力,然后对科技点和生产力进行分配,注意,科技点和生产力都必须完整分配(不能拆分到多个任务),且当前回合的科技点和生产力不能留到下一个回合。

游戏进程如下:

  1. 每个回合开始时,玩家获得:

    • 科技点 \(m\) 点(完成科技 \(i\) 后,\(m\) 永久增加 \(k_i\)
    • 生产力 \(p\) 点(整场游戏保持不变)
  2. 接着,玩家进行回合操作:

    • 科技点分配

      将此回合的 \(m\) 点科技点完整投入到已解锁的科技或者胜利槽

    • 生产力分配

      将此回合的 \(p\) 点生产力完整投入到任意一个科技(不管科技是否解锁)

求最小的非负生产力 \(p\) 使得玩家胜利,如果不存在 \(p\) 使得玩家胜利,输出 -1。

10 100 9
2
50 10 20 25
60 10 30 20
4

image-20251005115006830

题解

草,这道题真是阅读理解

这道题的框架不难看出来,大概就是二分+dp,思路就是二分一个 \(p\) ,然后dp判断能否在 \(t\) 回合内累计 \(s\) 点胜利点即可

难点在于如何设dp状态,以及转移方程

对于这道题,有几个比较关键的变量,我们考虑如何用dp将这几个变量表示出来

科技点,生产力,回合以及已解锁的科技

对于每个回合,都会有刷新的科技点和生产力等待分配,所以我们将回合设为阶段。

对于生产力以及科技点,我们都比较好推出,所以我们dp中再记已解锁的科技用于推出每回合获得的科技点以及下一个要解锁的科技。

但是科技还有个很蛋疼的“尤里卡”时刻,所以我们要想办法处理这个东西,因为尤里卡和生产力有关,而且生产力可以投入到未解锁的科技。

所以我们将生产力看做每回合不会消失,而是在累计,等到我们需要的时候可以直接使用,所以我们再记一个累积了多少回合的生产力可用。

那我们的dp状态也就有了,设 \(f(i,j,k)\) 表示到第 \(i\) 个回合,已经完成了前 \(j - 1\) 个科技,第 \(j\) 个科技已经解锁,还剩 \(k\) 回合的生产力可用,胜利槽中最多投入了多少科技点。

转移不难推出,分别考虑第 \(j\) 个科技是否触发尤里卡即可

\[ \]

code

posted @ 2025-10-05 17:56  michaele  阅读(10)  评论(0)    收藏  举报