鱼C论坛

 找回密码
 立即注册
查看: 1633|回复: 2

石子游戏,关于索引如何确定的问题

[复制链接]
发表于 2021-6-8 22:06:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Alice 和 Bob 轮流玩一个游戏,Alice 先手。

一堆石子里总共有 n 个石子,轮到某个玩家时,他可以 移出 一个石子并得到这个石子的价值。Alice 和 Bob 对石子价值有 不一样的的评判标准 。双方都知道对方的评判标准。

给你两个长度为 n 的整数数组 aliceValues 和 bobValues 。aliceValues 和 bobValues 分别表示 Alice 和 Bob 认为第 i 个石子的价值。

所有石子都被取完后,得分较高的人为胜者。如果两个玩家得分相同,那么为平局。两位玩家都会采用 最优策略 进行游戏。

请你推断游戏的结果,用如下的方式表示:

如果 Alice 赢,返回 1 。
如果 Bob 赢,返回 -1 。
如果游戏平局,返回 0 。

输入:aliceValues = [1,3], bobValues = [2,1]
输出:1
解释:
如果 Alice 拿石子 1 (下标从 0开始),那么 Alice 可以得到 3 分。
Bob 只能选择石子 0 ,得到 2 分。
Alice 获胜。

我的代码:

  1. class Solution:
  2.     def stoneGameVI(self, aliceValues: List[int], bobValues: List[int]) -> int:
  3.         sum_up = []
  4.         a_score = 0
  5.         b_score = 0
  6.         for i in range(len(aliceValues)):
  7.             sum_up.append(sum([aliceValues[i],bobValues[i]])) # 总体分数的和的序列
  8.         for a in range(len(sum_up)):
  9.             try:# pop会导致max空序列的错误,说明程序已经可以结束,直接返回比较分数
  10.                 maxnum_index = sum_up.index(max(sum_up)) # 最优策略:总是选总体分数最高的,问题在于总体分数最高是可以重复的,比如有100个10是最高的,index只能找第一个,如果不去掉,从右边找也只是重复一遍
  11.                 a_score += aliceValues[maxnum_index] # alice先手
  12.                 aliceValues.pop(maxnum_index)
  13.                 bobValues.pop(maxnum_index)
  14.                 sum_up.pop(maxnum_index)
  15.                 maxnum_index = sum_up.index(max(sum_up))
  16.                 b_score += bobValues[maxnum_index]
  17.                 aliceValues.pop(maxnum_index)
  18.                 bobValues.pop(maxnum_index)
  19.                 sum_up.pop(maxnum_index)
  20.             except:
  21.                 if a_score > b_score:
  22.                     return 1
  23.                 elif a_score < b_score:
  24.                     return -1
  25.                 else:
  26.                     return 0
复制代码

每次都要pop,效率太差了,但是确定最大值的索引又搞不来,求大佬优化代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-9 16:26:45 | 显示全部楼层
虽然题目和算法看不太懂,但是你如果仅仅需要确定最大值的索引,为何不试试用列表的排序方法?
  1. >>> help(list.sort)
  2. Help on method_descriptor:

  3. sort(self, /, *, key=None, reverse=False)
  4.     Sort the list in ascending order and return None.
  5.    
  6.     The sort is in-place (i.e. the list itself is modified) and stable (i.e. the
  7.     order of two equal elements is maintained).
  8.    
  9.     If a key function is given, apply it once to each list item and sort them,
  10.     ascending or descending, according to their function values.
  11.    
  12.     The reverse flag can be set to sort in descending order.
复制代码


实例,索引为-1或者0(看你用什么方法)
  1. >>> list1 = [1,3,2,4,6,5,8,7]
  2. >>> list2 = list1[:]
  3. >>> list.sort(list1, reverse=False)
  4. >>> list.sort(list2, reverse=True)
  5. >>> list1
  6. [1, 2, 3, 4, 5, 6, 7, 8]
  7. >>> list2
  8. [8, 7, 6, 5, 4, 3, 2, 1]
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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]
  对于代码而言会出现不一样的挑战

  1. class Solution:
  2.     def stoneGameVI(self, aliceValues: "List[int]", bobValues: "List[int]") -> int:
  3.         if len(aliceValues) != len(bobValues):
  4.             raise Exception("请输入两相同长度数组")
  5.         data_start = [1] * len(aliceValues)
  6.         data_stop = [0] * len(aliceValues)
  7.         aliceData, bobData = [], []

  8.         while data_start != data_stop:
  9.             max_aliceValues = max(aliceValues)
  10.             max_index_aliceValues = aliceValues.index(max_aliceValues)
  11.             aliceData.append(max_aliceValues)
  12.             data_start[max_index_aliceValues] = 0
  13.             aliceValues[max_index_aliceValues] = 0
  14.             bobValues[max_index_aliceValues] = 0

  15.             max_bobValues = max(bobValues)
  16.             max_index_bobValues = bobValues.index(max_bobValues)
  17.             bobData.append(max_bobValues)
  18.             data_start[max_index_bobValues] = 0
  19.             bobValues[max_index_bobValues] = 0
  20.             aliceValues[max_index_bobValues] = 0

  21.             if max_aliceValues == max_bobValues == 0:
  22.                 break
  23.             
  24.         if sum(aliceData) > sum(bobData):
  25.             return 1
  26.         elif sum(aliceData) == sum(bobData):
  27.             return 0
  28.         else:
  29.             return -1


  30. if __name__ == "__main__":
  31.     s = Solution()
  32.     print(s.stoneGameVI(aliceValues=[1, 3], bobValues=[2, 1]))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-22 23:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表