一个关于“取数问题”的游戏

来源:互联网 发布:ubuntu优麒麟安装 编辑:程序博客网 时间:2024/06/12 21:34

最近在算法分析与设计课上老师讲了一个“取数问题”的小游戏实例,没太听明白,于是上网搜索了一下,总算理清了思路,在这里与大家分享一下。


【问题背景】随机给出一个由2n个自然数组成的数列(n为正整数),两个参赛者A、B轮流从数列中取数,各方每次只能从数列的头或尾取一个数。当数列中的数被取完后,即双方均取了n个数后,将各方所取数相加,结果最大者获胜。假设A先取,问有没有A必胜的取法?


【假设】若所给的自然数数列为:6  7  4  8  1  4  2  3


【策略1】

参赛双方均为贪心策略,即取数列两头中的最大者。

则双方所取的数为:

A:6  4  3  4

B:7  8  2  1

总和A为17,B为18,B获胜。

但明显,这种取数策略的输赢是随机的,当随机数列不同时,结果也可能不同。比如说,对于数列 9 6 5 4 2 6 4 3,A取数结果为9 5 3 6,总和为23;B取数结果为6 4 4 2,总和为16,A获胜。


【策略分析】

为原始的随机数列标上序号:

6    7    4    8    1    4    2    3

①  ②  ③   ④  ⑤   ⑥  ⑦   ⑧

可以发现,因为A先取,所以无论是第一次取数还是B取数完毕后,A都可以选择是取奇数位置上的数还是偶数位置上的数。而且当A取数完毕后,留下给B取的头尾两个数必定都是奇数位置上的或者偶数位置上的。也就是说,A的取数策略可以直接使得A、B各方仅取到所有奇数位置上的数或者偶数位置上的数。


【A必胜策略】

基于前面的分析,A只需要计算数列奇数位置上的数之和与偶数位置上的数之和哪方较大,然后仅取该位置上对应的数即可。比如说,对于“策略分析”部分的数列,奇数位置上的数为6 4 ,1 2,总和是13;偶数位置上的数为7 8 4 3,总和为22。故A每次只需要取偶数位置上的数,就可以保证必胜。

0 0
原创粉丝点击