[ARC070F] HonestOrUnkind

[ARC070F] HonestOrUnkind

简要写一下洛谷题解区 LHF 先生的做法以及正确性证明:

首先有解有必要条件 \(a \ge b\),否则令 \(a\) 个坏人做与好人对称的事情就不能区分了。

那么现在可以利用 \((n - 1)\) 次询问判断一个人是好人还是坏人。

这时候随机一个人并判断是否为好人,一旦找到一个好人再花费 \((n - 1)\) 次询问询问所有人,期望询问次数为 \(3n - 3\)

注意到大多数都是好人,考虑这样一个类似摩尔投票法的算法:钦定一个人为好人,同时对他人询问当前钦定的好人,若回答 Yes,则可信度加一,否则可信度减一,若可信度小于零,则更换钦定的好人为当前的询问对象。最后保留下来的人就是真正的好人。总询问次数为 \(2n - 2\)

正确性证明:考虑反证,若最后保留下了坏人 \(k\),则以 \(k + 1\) 开头的后缀中坏人数大于等于好人数,并且以 \(k\) 结尾的前缀中坏人数大于好人数(记对好人的 Yes 和对坏人的 No 为 1,则 1 的数量小于 0 的数量),矛盾。

posted @ 2023-03-07 07:36  DCH233  阅读(20)  评论(0编辑  收藏  举报