|
发表于 2021-6-9 17:10:15
|
显示全部楼层
本帖最后由 qq1151985918 于 2021-6-9 18:26 编辑
这是我自己写的,没比较过效率,供参考
另外,关于这个游戏介绍,仍然有很多我认为的争议点
1.每次都是A先选吗?那么如果数列是奇数个例如3,5,7
那么先选的总是占据多选的优势
2.分值问题,如果A认为分值为[1,2,3]而B认为分值为[100,200,300]
即使是奇数数组仍然难以避免输掉,自己选择自己认为的分值,本身就不公平
当然这种情况只存在代码讨论阶段,意义不大
3.题目中说的最优策略的具体意义是什么?
如果只是每次都选择自己认为的自己的最高分,那么显然存在第二点的问题
如果可以选择对手认为的最高分,那么假如 数组A = [1,2,3,4],数组B = [9,1,2,3]
那么 A 先选是第一个选索引值为3的4分,还是选索引值为0的1分?
按照理解似乎是应该选择 1 分
如果是选择1分,那么对后选的选手又是极度不公平,后选的B可能很难赢,除非出现例2的情况
4.数组中会不会出现0分的存在?如果存在,例如A = [0,0,0,0,1,2,3] B = [3,0,2,0,1,0,0]
对于代码而言会出现不一样的挑战
- class Solution:
- def stoneGameVI(self, aliceValues: "List[int]", bobValues: "List[int]") -> int:
- if len(aliceValues) != len(bobValues):
- raise Exception("请输入两相同长度数组")
- data_start = [1] * len(aliceValues)
- data_stop = [0] * len(aliceValues)
- aliceData, bobData = [], []
- while data_start != data_stop:
- max_aliceValues = max(aliceValues)
- max_index_aliceValues = aliceValues.index(max_aliceValues)
- aliceData.append(max_aliceValues)
- data_start[max_index_aliceValues] = 0
- aliceValues[max_index_aliceValues] = 0
- bobValues[max_index_aliceValues] = 0
- max_bobValues = max(bobValues)
- max_index_bobValues = bobValues.index(max_bobValues)
- bobData.append(max_bobValues)
- data_start[max_index_bobValues] = 0
- bobValues[max_index_bobValues] = 0
- aliceValues[max_index_bobValues] = 0
- if max_aliceValues == max_bobValues == 0:
- break
-
- if sum(aliceData) > sum(bobData):
- return 1
- elif sum(aliceData) == sum(bobData):
- return 0
- else:
- return -1
- if __name__ == "__main__":
- s = Solution()
- print(s.stoneGameVI(aliceValues=[1, 3], bobValues=[2, 1]))
复制代码 |
|