一个关于“取数问题”的游戏
来源:互联网 发布: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每次只需要取偶数位置上的数,就可以保证必胜。
- 一个关于“取数问题”的游戏
- 一个递归实现的取数游戏
- 关于取一个数的前几位
- 关于scanf 取数顺序的问题
- 关于一个指针取值的问题
- 关于打印浮点数的一个问题
- 取一个数的前几位
- 关于jQuery.query.js 取参数的一个小问题
- 关于Session在一个Servlet取不到值的问题
- 取数游戏
- 矩阵取数游戏
- 取数游戏
- 取数游戏
- 矩阵取数游戏
- 蓝桥杯-取数游戏
- 取数游戏 贪心
- 取数游戏
- 1308 取数游戏
- JAVA的构造函数与函数重载
- sql server2005安装
- 这是一个开始
- adb logcat 命令行用法
- Unity3D中文视频教程【超清+精选】
- 一个关于“取数问题”的游戏
- 尚广杰的一些介绍,还有自己曾经的一个开发项目
- 用eclipse连接github
- 随笔之~终于知道为什么程序员杜绝百度百科爱谷歌
- 【创想】【完全NP问题】多机调度问题,网络流基础上建立新算法
- Linux/Unix下ODBC的安装、配置与编程
- 谈下自己做过的一个app项目:去哪吃
- UVA - 340 Master-Mind Hints
- Problem 1082 最大黑区域