P8079 [WC2022] 猜词

· · 题解

:::info[喜提洛谷当前最优解]{open} 信息熵函数不同于所有题解。

https://www.luogu.com.cn/record/231900101 :::

:::warning[Warning]{open} 猜测的单词不一定要属于答案集。 :::

我们需要最大化猜测一个单词带来的价值。设答案集为 S,考虑计算猜测一个单词所能缩小 |S| 的比率。设计以下熵函数:

E(\text{word})=\sum_{c\in\text{color}(\text{word},S)} P(c)\frac{1}{P(c)}=|\text{color}(\text{word},S)|

其中,\text{color}(\text{word},S) 表示猜测 \text{word},且答案集为 S 时的可能颜色集。颜色指交互库返回的数组 \text{gold}\text{silver}

:::success[Tip]{open} 比率基于乘除法意义。故理论上应使用加权几何平均,或取对数后的加权算术平均(也就是分类交叉熵函数)。

但是以上二者分别使用了指数函数和对数函数,计算速度较慢。

采用这里的方法可以避免进行指数,对数和浮点数计算,极大地提高了程序的运行效率。 :::

于是每次猜测只需选择 E(\text{word}) 最大的单词即可。

但是,当 |S| 极小时,所有的 E(\text{word}) 可能是一样的。为了选择 S 中的单词,我们考虑给 S 中单词的 E(\text{word}) 增加额外权值。更改函数为:

E(\text{word})=[\text{word}\in S]\cdot \varepsilon+|\text{color}(\text{word},S)|

由于第一次猜测前计算 E(\text{word}) 太慢了,很难卡过去。

注意到交互库传入了参数 initial_letter。考虑预处理答案的首字母一定时,E(\text{word}) 最大的单词,就不会 TLE 了。

本地测试 1000 局,平均分高达 100.350。

:::success[温馨提示]{open} 代码就不放了,自己写可以提高代码能力。 :::