题目大意:
某一岛上有p1个只说真话的人(好人),p2个只说谎话的人(坏人),所有人都有一个唯一的编号(1~p1+p2)询问n次.
询问格式 a b res:
问a号,b号是否是好人,res可以是yes或者no.
判断是否能找出所有好人,可以的话输出好人的编号再加个end,否则输出no.
题目思路:
当回答是yes:
如果a是好人,那么b肯定也是好人,反之a是坏人,那么b也肯定是坏人.
所以回答是yes时,a和b是同一类人. www.2cto.com
当回答是no时,同样可以证明,a和b不是同一类人.
所以我们可以用并查集把所有可以判断是否同类的人归在一个集合.
之后我们就要判断是否有唯一的一种组合使得有p1个人为好人.
这里我们可以用到dp,因为这个很像背包.
dp[i][j],表示前i个集合中有j人是好人的组合有几个.
显然如果dp[集合数][p1]如果等于1,那么就是有答案了.
状态方程也很容易推导的.
代码:
[cpp]
#include
#include
#include
#include
#include
#include
#include
#include