这是标准的约瑟夫斯问题:-有“ N”个人在世。它们都以循环方式(从1到N)站立。
人'1'与人'2'相邻,人'2'与人'3'相邻..............人'N'与人'1'相邻。 / p>
人员“ 1”(有枪)总是开始杀死。他(和其他人)总是杀害一个在世的人,无论谁还活着。这个过程一直持续到只有一个人活着。
如何找到要活着的人?
示例:-让“ 5”人参加。人物'1'杀死人物'2'。现在,枪与人物'3'在一起。他杀死了“ 4”人。现在,枪与“ 5”人在一起。他杀死了人“ 1”。现在,枪与“ 3”人在一起。人“ 3”杀死人“ 5”。现在一个人杀死了他,因为他是唯一剩下的人。
答案:-'Person-3'。
我知道解决这个问题的算法。
我的代码:-
(C ++)
Here it is(link):---> https://ideone.com/
O(N)
现在,这个问题的变化是:-
圈子中的每个人都有一个索引“ i”和一个值x(i)(每个人的能力)
有一个人“ M”和变量“ s”(初始化为零)。
我们可以在圈子中的任意两个人之间插入人“ M”(已经形成为开头)。
现在,“ M”人是不朽的,不会杀死任何人。每当索引为“ i”的人攻击“ M”时,他什么都没有发生,但是“ s”的值增加了“ x(i)”。
'M'人拿到了枪。他什么也没做。只需将其交给下一个活着的人即可。这个过程一直持续到只剩下两个人为止。其中一个肯定是“ M”人,因为他是不朽的。
现在,我们尝试在圆圈的所有可能位置插入“ M”并计算出“ s”。
我想找到最小的's'。
我想到的一个显而易见的解决方案是在每个可能的位置插入“ M”,然后在O(N)中计算相应的“ s”。总时间复杂度:-O(N ^ 2)。我正在寻找一种更有效的方法。
示例:-
让我们说人们是:-[12,34,45,5]
让我们在第三和第四个人之间插入'M'。
[12,34,45,M,5]
然后,发生以下情况:
拥有权力12的人攻击拥有权力34的人并杀死他。
拥有45力量的人攻击守卫的M。
s = 45。
M现在是攻击者。
M不会攻击,因此右边的人(拥有5的力量)将成为攻击者。
他用12点力量攻击该人并杀死他。
拥有45力量的人再次攻击M,M再次防御。
s = 45 + 45 = 90。
5级力量的人攻击45级力量的人并杀死他。
s = 90(答案)。 (现在只剩下2个人了)