【发布时间】:2015-09-12 11:32:20
【问题描述】:
所以,我在一次采访中被问到这个问题:
有两个朋友在玩一个游戏,他们从包含n 正数的数组中选择一个数字。两个朋友一次选择一个数字,两个玩家都以最佳方式玩游戏。并且您必须找出游戏结束后您可以获得的最大总和(正在选择的数字)是多少。在我没有限制地回答同一个问题后给出的限制是:
- 在双方玩家的第一步中,他们可以选择任何数字。
- 除了第一次移动外,他们只能选择与给定数组中的前一个数字相邻的数字,并且直到游戏中的那一刻之前第一个和第二个玩家都没有选择过。 (澄清为编辑)
如果玩家无法移动,他/她将停止游戏。当两个玩家都无法移动时,游戏结束。
现在,我给出的解决方案是:
- 创建一个结构,其中包含输入数组中的值以及值的索引。
- 将之前的结构创建一个数组,并将第一步的值存储在这个数组中。
- 根据值以非降序对该数组进行排序。
- 开始以贪婪的方式选择一个值并打印最大值。
尽管我也可以编写代码,但他们更多地在寻找伪代码。但是,面试官说这在某些情况下会失败。我想了很多关于哪些情况会失败但找不到任何情况。因此,我在这个问题上需要帮助。
另外,如果可能的话,请附上我可以做些什么来改进它的伪代码。
编辑:我想我的问题不够清楚,特别是第二点。面试官的意思是:
如果这不是玩家的第一个动作,他必须选择一个与他在之前的动作中已经选择的数字相邻的一个数字。
另外,是的,两位玩家都以最佳方式玩游戏,他们轮流选择数字。
Edit2:所以,我的朋友也问了同样的问题,但做了一点修改。他得到的不是一个数组,而是一个图表。所以,就像我的情况一样,我只能选择与我之前选择的索引相邻的索引,给他的是一个无向图(邻接表作为输入),他只能选择特定移动中的那些顶点直接连接到任何先前选择的顶点。
例如:
假设正整数的数量是 3。这些整数的值是 4、2、4,如果我将正整数命名为 A、B 和 C,那么,
A - B
B - C
上面是给我朋友的例子,上面的答案是6。你能指出我如何从这个开始的正确方向吗?谢谢!
【问题讨论】:
-
您的解决方案当然是错误的。比如说,数组是:
20 20 20 20 20 1 1 1 1 50(10 项)。你按非降序排序给你50 20 20 20 20 20 1 1 1 1。现在,你选择50开始,其他玩家选择20。现在,由于邻居选择限制,你只能选择1,而他总是可以选择20。最后,你输了,54-100。 -
你必须找到被选中的数字的最大总和(由两个玩家)还是别的什么?
-
如果都是正整数,那么肯定是最大和 = 数组中所有元素的总和,这发生在两个玩家从左右边界开始并朝着对方前进时。我认为还有更多。
-
@Dante 这里没有思维游戏。第一个玩家必须选择将数组平分的项目,两个结果数组的总和差小于选择的数字。如果可以实现,则 p1 获胜,否则,p2 获胜。
-
@PeterCordes 我认为对
both friends select one number at a time的最佳解释是他们轮流进行。否则他们都会在第一回合选择最好的物品。很明显,p2 的最佳第一步将紧挨着 p1。没有太多选择