有n个人,其中超过半数是好人,剩下的是坏人
好人只说真话,坏人可能说真话也可能说假话
这n个人互相都知道对方是好人还是坏人
现在要你从这n个人当中找出一个好人来,只能通过以下方式:
每次挑出两个人,让这两个人互相说出对方的身份,
你根具两个人的话进行判断。
问通过何种方法才能最快的找出一个好人来,
(要考虑最坏的情况)
可能的答案:
思想是尽量多的排除坏人:
1,如果两个人都说对方是好人,那么有两种可能,要吗都是好人,要吗都是坏人.
2,如果有一个人说对方是坏人,那么两人种至少有一个坏人,可以同时排除,剩下的人照样满足条件好人站半树以上,再在剩下的人中找好人
int people[] = {0,1,1,1,1,0,0,0,1};//N个人的数组1是好人,0是坏人
int samePos = -1, sameNum = -1;
while(i < N - 1)
{
if(samePos != -1)
{
if(第samePos个人和第i个人都说对方是好人)
{
i++;
sameNum++;
if(sameNum > N/2)//超过一半,肯定都是好人
{
return people[samePos];
}
}
else
{
sameNum--;
i++;
if(sameNum == 0)
{
samePos = -1;
}
}
continue;
}
if(第i个人和第i + 1个人都说对方是好人)
{
samePos = i;
sameNum = 2;
}
else
{
i += 2;
}
}
最后要吗剩下一个好人,要吗剩下一串好人,复杂度为o(n) ,最快n/2,最慢n.写的不太严密,请大家指正.