java实现第七届蓝桥杯取球博弈
题目9、取球博弈
取球博弈
两个人玩取球的游戏。
一共有N个球,每人轮流取球,每次可取集合{n1,n2,n3}中的任何一个数目。
如果无法继续取球,则游戏结束。
此时,持有奇数个球的一方获胜。
如果两人都是奇数,则为平局。
假设双方都采用最聪明的取法,
第一个取球的人一定能赢吗?
试编程解决这个问题。
输入格式:
第一行3个正整数n1 n2 n3,空格分开,表示每次可取的数目 (0<n1,n2,n3<100)
第二行5个正整数x1 x2 ... x5,空格分开,表示5局的初始球数(0<xi<1000)
输出格式:
一行5个字符,空格分开。分别表示每局先取球的人能否获胜。
能获胜则输出+,
次之,如有办法逼平对手,输出0,
无论如何都会输,则输出-
例如,输入:
1 2 3
1 2 3 4 5
程序应该输出:
+ 0 + 0 -
再例如,输入:
1 4 5
10 11 12 13 15
程序应该输出:
0 - 0 + +
再例如,输入:
2 3 5
7 8 9 10 11
程序应该输出:
+ 0 0 0 0
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 3000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
本题是拈游戏的一个拓展,考查减治法和动态规划法思想的运用,下面代码,对于题中所给三组数据均可以通过,但是对于平局(均为奇数或均为偶数)细节处理问题上有待证明,感觉自己处理的不够严谨。下面代码仅供参考哦~
import java.util.Scanner;
public class Main {
public static int[] value = new int[1000];
public static int[] getN = new int[3];
public static int[] init = new int[5];
public static char[] result = {'-','0','0','+'};
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
for(int i = 0;i < 3;i++)
getN[i] = in.nextInt();
for(int i = 0;i < 5;i++)
init[i] = in.nextInt();
int minN = Math.min(getN[0], Math.min(getN[1], getN[2]));
if(minN % 2 == 1) //此处关于平局,两者是均为奇数,还是均为偶数问题,这里处理原因,是我自己猜想
value[0] = 1; //代表平局,两者默认均为奇数个
else
value[0] = 2; //代表平局,两者默认均为偶数个
for(int i = 1;i < minN;i++)
value[i] = 2; //0代表负,1和2代表平局,3代表胜
for(int i = minN;i < 1000;i++) {
int temp = 0; //初始化,当前i个球,先取者必输
for(int j = 0;j < 3;j++) {
if(i - getN[j] < 0)
continue;
if(i - getN[j] == 0 && getN[j] % 2 == 1)
temp = 3;
if(value[i - getN[j]] == 0) { //表示i - getN[j]个球先取时,必输
if(getN[j] % 2 == 0)
temp = 3;
//此时最终结果为两人取的球均为偶数个,但是若temp取三个数中另外一个数时
//,是必赢结果,则舍弃这个平局结果
else
temp = 2 > temp ? 2 : temp;
}
if(value[i - getN[j]] == 1) { //表示i - getN[j]个球先取时,两人取球均为奇数个
if(getN[j] % 2 == 0)
temp = 1 > temp ? 1 : temp; //此处做比较同上
}
if(value[i - getN[j]] == 2) {//表示i - getN[j]个球先取时,两人取球均为偶数个
if(getN[j] % 2 == 1)
temp = 3; //此种情况出现,必赢,不必做比较判断
else
temp = 2 > temp ? 2 : temp; //此处比较同上,排除必输情况
}
if(value[i - getN[j]] == 3) {//表示i - getN[j]个球先取时,必赢
if(getN[j] % 2 == 1)
temp = 1 > temp ? 1 : temp;
}
}
value[i] = temp; //当前i个球,先取者最终输赢结果
}
//打印题意最终结果
for(int i = 0;i < 5;i++)
System.out.print(result[value[init[i]]]+" ");
}
}
java实现第七届蓝桥杯取球博弈的更多相关文章
- java算法 第七届 蓝桥杯B组(题+答案) 9.取球博弈
9.取球博弈 (程序设计) 两个人玩取球的游戏.一共有N个球,每人轮流取球,每次可取集合{n1,n2,n3}中的任何一个数目.如果无法继续取球,则游戏结束.此时,持有奇数个球的一方获胜.如果两人都是 ...
- 2016蓝桥杯"取球博弈"问题
较难,网上有能得出正确结果的代码,但是读了一下,像是拼凑出的结果,逻辑不通,代码和注释不符 参考网上代码写了一版,结构相对清晰,注释比较详细 题目很长: 两个人玩取球的游戏.一共有N个球,每人轮流取球 ...
- java实现第七届蓝桥杯冰雹数
题目8.冰雹数 题目描述 任意给定一个正整数N, 如果是偶数,执行: N / 2 如果是奇数,执行: N * 3 + 1 生成的新的数字再执行同样的动作,循环往复. 通过观察发现,这个数字会一会儿上升 ...
- java实现第七届蓝桥杯七星填数
七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...
- java算法 第七届 蓝桥杯B组(题+答案) 10.压缩变换
10.压缩变换 (程序设计) 小明最近在研究压缩算法.他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比.然而,要使数值很小是一个挑战. 最近,小明需要压缩一些正整数的序列,这些 ...
- Java实现第七届蓝桥杯国赛 赢球票
标题:赢球票 某机构举办球票大奖赛.获奖选手有机会赢得若干张球票. 主持人拿出 N 张卡片(上面写着 1~N 的数字),打乱顺序,排成一个圆圈. 你可以从任意一张卡片开始顺时针数数: 1,2,3- 如 ...
- java实现第七届蓝桥杯四平方和
四平方和 四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1^ ...
- java实现第七届蓝桥杯平方圈怪
平方圈怪 题目描述 如果把一个正整数的每一位都平方后再求和,得到一个新的正整数. 对新产生的正整数再做同样的处理. 如此一来,你会发现,不管开始取的是什么数字, 最终如果不是落入1,就是落入同一个循环 ...
- java实现第七届蓝桥杯有奖竞猜
有奖竞猜 题目描述 小明很喜欢猜谜语. 最近,他被邀请参加了X星球的猜谜活动. 每位选手开始的时候都被发给777个电子币. 规则是:猜对了,手里的电子币数目翻倍, 猜错了,扣除555个电子币, 扣完为 ...
随机推荐
- Java -> 构造器(构造方法)
构造方法 我们对封装已经有了基本的了解,接下来我们来看一个新的问题,依然以Person为例,由于Person中的属性都被private了,外界无法直接访问属性,必须对外提供相应的set和get方法.当 ...
- 2018-07-01 jq效果
jq效果的实现方法: 1.基本 show(time) -> 显示:相当于display:block hide(time) -> 隐藏:相当于display:none toggle(time ...
- Visual C++ 6.0(完整绿色版)的下载、安装和破解(图解)
vc工具的下载 链接: https://pan.baidu.com/s/1GTkcWjureiZS_2WL2dvrMw 提取码: 5859 首先点击链接下载好压缩包并解压 这里是解压好滴文件目录 双击 ...
- .NET 程序员的 Playground :LINQPad
如果想执行一个简单的 C# 语句并获得运行结果,通常我们需要做几个步骤才能达成: 打开 Visual Studio 并新建一个控制台项目. 在 Program.cs 中编写代码并保存. 点击运行按钮或 ...
- Codeforces1183C(C题)Computer Game
Vova is playing a computer game. There are in total nn turns in the game and Vova really wants to pl ...
- 如何使用Postman生成不同格式测试的报告
Postman还可以生成测试报告,还是多种格式报告? Postman团队开源Newman作为Postman运营工具,该开源库使用命令行方式执行Postman 脚本,并且生成多种格式报告,还支持Post ...
- Blazor WebAssembly 3.2 正式发布
5月 20日,微软 发布了 Blazor WebAssembly 3.2(https://devblogs.microsoft.com/aspnet/blazor-webassembly-3-2-0- ...
- 11_ArrayList集合的方法
class Program { static void Main(string[] args) { //数组:长度不可变,类型单一 //ArrayList集合:长度可以任意改变,类型可以不单一 //创 ...
- os.walk()的实际应用
背景: 通过Mobaxterm从本地上传虹膜数据,一共79个类,每类里包含左右眼各400张数据,总共63200张,上传期间断网不确定是否传完. 思路: 1.首先遍历总类别数是否正确,若不足79,返回“ ...
- rancher证书过期
背景 无法打开rancher服务,报错如下截图,可以看出是证书过期了无法连上k8s,注意这里的证书是rancher自身证书并非k8s证书. 解决方法 rancher升级:https://rancher ...