如何找到可能的最小值?

时间:2019-07-08 21:26:43

标签: optimization

这是标准的约瑟夫斯问题:-有“ 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个人了)

0 个答案:

没有答案