1 条题解
-
0
自动搬运
来自洛谷,原作者为

MiyazonoKaori
「私の翼は、あなたのために生まれたから」||主页:https://www.luogu.me/paste/vnxgw02d(能看)搬运于
2025-08-24 23:07:02,当前版本为作者最后更新于2025-03-06 19:36:29,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
https://www.luogu.com.cn/user/1294410和https://www.luogu.com.cn/user/1275540ts。

不可以,总司令。让我们回到正题,我使用的是动态规划实现,时间复杂度为 ,这个时间复杂度看似很高,实际一点也不少,但是我们可以通过剪枝实现。
表示
s:表示当前的状态,使用状态压缩来表示已经访问过的城市和道具的使用情况。f[s]:状态s下使用的最少武器数量。g[s]:状态s下最后一把武器的剩余耐久。
转移
然后就开始推动态转移方程式,我们需要分两种情况:
- 使用这个道具;
- 不使用这个道具。
状态转移的核心思想是:从当前状态
s出发,访问一个新的城市i,并更新状态s和对应的f[s]和g[s]。1. 状态转移
假设当前状态为
s,尝试访问一个新的城市i:-
如果当前武器的剩余耐久
g[s]加上怪物i的血量a[i]不超过当前武器的耐久b[f[s]],则可以直接使用当前武器击败怪物i,并更新状态s和f[s]、g[s]。转移方程:
-
如果当前武器的剩余耐久
g[s]加上怪物i的血量a[i]超过当前武器的耐久b[f[s]],则需要丢弃当前武器并尝试使用下一把武器。转移方程:
2. 使用道具的状态转移
如果城市
i有道具d[i],则可以使用道具来减少怪物i的血量。假设当前状态为s,尝试访问一个新的城市i并使用道具d[i]:-
如果当前武器的剩余耐久
g[s]加上减少后的怪物血量max(a[i] - d[i], 0)不超过当前武器的耐久b[f[s]],则可以直接使用当前武器击败怪物i,并更新状态s和f[s]、g[s]。转移方程:
-
如果当前武器的剩余耐久
g[s]加上减少后的怪物血量max(a[i] - d[i], 0)超过当前武器的耐久b[f[s]],则需要丢弃当前武器并尝试使用下一把武器。转移方程:
总结
-
不使用道具:
$$f[s \cup \{i\}] = \begin{cases} f[s] & g[s] + a[i] \leq b[f[s]] \\ f[s] + 1 & \text{其它} \end{cases}$$$$g[s \cup \{i\}] = \begin{cases} g[s] + a[i] & g[s] + a[i] \leq b[f[s]] \\ a[i] & \text{其它} \end{cases} $$ -
使用道具:
$$f[s \cup \{i\}] = \begin{cases} f[s] & g[s] + \max(a[i] - d[i], 0) \leq b[f[s]] \\ f[s] + 1 & \text{其它} \end{cases} $$$$g[s \cup \{i\}] = \begin{cases} g[s] + \max(a[i] - d[i], 0) & g[s] + \max(a[i] - d[i], 0) \leq b[f[s]] \\ \max(a[i] - d[i], 0) & \text{其它} \end{cases} $$
答案
我们需要找到所有城市都被访问过的状态,即
s = (1 << n) - 1,并检查f[s]是否小于k。如果f[s] < k,则输出f[s] + 1和b[f[s]] - g[s];否则输出FAIL。
- 1
信息
- ID
- 11160
- 时间
- 3000ms
- 内存
- 512MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者