【算法趣题】Q10 轮盘的最大值

浏览: 2442

前言

【算法趣题】是来自图灵程序设计丛书绝云译的《程序员的算法趣题》,书中是用Ruby实现的。这里是用python来实现。

问题描述

轮盘是机轮盘赌博会或者运气的游戏,几乎没有人可以操控赔率。不论您如何下注,赢得赌注的几率都是相对一定的,这是您无法改变的。

轮盘一般分两种:美式和欧式。美式有零位和双零位,而欧式则只有零位。前者赌场的优势为5.26%,而后者仅有2.7%。因此欧式轮盘将是更好的选择。

下面我们要找出在这些规则下,“连续n个数字的和”最大的位置。

举个例子,当n=3时,按照欧式规则得到的最大的组合是36,11,30这个组合,和为77;而美式规则下则是24,36,13这个组合,得到的和为73.(图中所示轮盘为欧式规则的轮盘,注意轮盘是圆形的)


欧式规则:
0,32,15,19,4,21,2,25,17,34,6,27,13,36,11,30,8,23,10,5,24,16,33,1,20,14,31,9,22,18,29,7,28,12,35,3,26

美式规则:
0,28,9,26,30,11,7,20,32,17,5,22,34,15,3,24,36,13,1,00,27,10,25,29,12,8,19,31,18,6,21,33,16,4,23,35,14,2

当 2 ≤ n ≤ 36时,求连续n个数之和最大的情况,并找出满足条件“欧式规则下的和小于美式规则下的和”的n的个数。

思路

我们先来考虑连续n个数之和最大的情况。我们用数组来表示轮盘的数字排布,比如欧式规则为:

European = [0,32,15,19,4,21,2,25,17,34,6,27,13,36,11,30,8,23,10,5,24,16,33,1,20,14,31,9,22,18,29,7,28,12,35,3,26]

美式规则为:

American = [0,28,9,26,30,11,7,20,32,17,5,22,34,15,3,24,36,13,1,00,27,10,25,29,12,8,19,31,18,6,21,33,16,4,23,35,14,2]

假如n=3,考虑到转盘是圆的,用数组表示的话,数组要扩充2(n-1)位,扩充的2位就是数组的前两位。数组的求和可以用sum。

图片.png

European 数组中的前3位可表示为 European[0: 3],对这3位求和,即sum(European[0: 3])

图片.png

数组添加元素,则使用append.

python3实现

def max_sum(round_list, n):
    tmp_list = round_list.copy()
    s = sum(tmp_list[:n])
    last = str(tmp_list[:n])
    for i in range(n,len(tmp_list)+n):
        if i > len(tmp_list)-1: # 如果i超过原数组的长度,就要添加元素
            tmp_list.append(tmp_list[i-len(round_list)])
        tmp = sum(tmp_list[i-n:i])
        if tmp > s:
            s = tmp
            last = str(tmp_list[i-n:i])
#     print(last)
    return s
European = [0,32,15,19,4,21,2,25,17,34,6,27,13,36,11,30,8,23,10,5,24,16,33,1,20,14,31,9,22,18,29,7,28,12,35,3,26]
American = [0,28,9,26,30,11,7,20,32,17,5,22,34,15,3,24,36,13,1,00,27,10,25,29,12,8,19,31,18,6,21,33,16,4,23,35,14,2]
count = 0
for n in range(2,37):
if max_sum(European, n) < max_sum(American, n):
count = count + 1
print(count)

答案为9。


可以来验证下,当n=3时,组合对不对。

图片.png


到此为止,第一章入门篇共10个题,断断续续中完成了。接下来就是第二章初级篇了。

推荐 0
本文由 _缘君_ 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册