蓝桥杯——说好的进阶之取数博弈游戏(动态规划实现)

今盒子里有n个小球,A、B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断。

我们约定:

每个人从盒子中取出的球的数目必须是:1,3,7或者8个。

轮到某一方取球时不能弃权!

A先取球,然后双方交替取球,直到取完。

被迫拿到最后一个球的一方为负方(输方)

请编程确定出在双方都不判断失误的情况下,对于特定的初始球数,A是否能赢?

程序运行时,从标准输入获得数据,其格式如下:

先是一个整数n(n<100),表示接下来有n个整数。然后是n个整数,每个占一行(整数<10000),表示初始球数。

程序则输出n行,表示A的输赢情况(输为0,赢为1)。

例如,用户输入:

10

18

则程序应该输出:

0

1

1

0

public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner scanner = new Scanner(System.in);
		int n = Integer.parseInt(scanner.nextLine());
		int[] t = new int[n];
		for (int i = 0; i < n; i++) {
			t[i] = Integer.parseInt(scanner.nextLine());
		}
		cal(t);
		//cal_qs();// test
	}

	static void cal(int[] t) {
		int iarr[] = new int[10000];
		iarr[0] = 1;
		int[] b = new int[] { 1, 3, 7, 8 };

		for (int i = 1; i < iarr.length; i++) {
			for (int j = 0; j < 4; j++) {
				// 使对方一定输,则赢
				if (i - b[j] >= 0 && iarr[i - b[j]] == 0) {
					iarr[i] = 1;
				}
			}
		}

		for (int i = 0; i < t.length; i++) {
			System.out.print(iarr[t[i]] + "\n");
		}
	}

蓝桥杯——说好的进阶之取数博弈游戏(动态规划实现)

时间: 2024-10-11 22:49:08

蓝桥杯——说好的进阶之取数博弈游戏(动态规划实现)的相关文章

蓝桥杯——说好的进阶之完全背包问题

有N种物品和一个载重量为W的背包,每种物品都有无限件可用.第i种物品的重量是w,价值是p.将哪些物品装入背包可使这些物品的重量总和不超过背包总重量,且价值总和最大.(对比01背包问题,取或不取与无限件) static int W=10; static int[] w_arr = new int[]{3,2,5,1,6,4}; static int[] p_arr = new int[]{6,5,10,2,16,8}; static int[][] v; public static void ma

蓝桥杯——说好的进阶之砝码称重(贪心算法)

5个砝码 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量. 如果只有5个砝码,重量分别是1,3,9,27,81.则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中). 本题目要求编程实现:对用户给定的重量,给出砝码组合方案. 例如: 用户输入: 5 程序输出: 9-3-1 用户输入: 19 程序输出: 27-9+1 要求程序输出的组合总是大数在前小数在后. 可以假设用户的输入的数字符合范围1~121. public static void main(String

蓝桥杯——说好的进阶之买不到的数目

问题描述 小明开了一家糖果店.他别出心裁:把水果糖包成4颗一包和7颗一包的两种.糖果不能拆包卖. 小朋友来买糖的时候,他就用这两种包装来组合.当然有些糖果数目是无法组合出来的,比如要买 10 颗糖. 你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17.大于17的任何数字都可以用4和7组合出来. 本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字. 输入格式 两个正整数,表示每种包装中糖的颗数(都不多于1000) 输出格式 一个正整数,表示最大不能买到的糖数 样例输入1

蓝桥杯——说好的进阶之入学考试

问题描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:"孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值.我会给你一段时间,在这段时间里,你可以采到一些草药.如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大." 如果你是辰辰,你能完成这个任务吗? 输入格式 第一行有两个整数T(1 <= T <= 10

蓝桥杯——说好的进阶之去重复元素的排列组合

将待排列(组合)的数组,先分别统计出种类和个数,然后进行避免重复的排列(组合). /* 1,1,2,3的排列组合 去重复 * (借此复习排列组合) * * 1:2 2个1 * 2:1 1个2 * 3:1 1个3 * * */ static int[] iarr = new int[3];//目标序列 static int[] carr = new int[] { 1, 2, 3 };//3种item static int[] used = new int[] { 2, 1, 1 };//每种it

蓝桥杯——说好的进阶之和式分解

对于正整数 n,输出和等于 n且组成和式的数字从左至右是非递增的所有正整数和式. 输入: 6 输出: 6=6 6=5+1 6=4+2 6=4+1+1 6=3+3 6=3+2+1 6=3+1+1+1 6=2+2+2 6=2+2+1+1 6=2+1+1+1+1 6=1+1+1+1+1+1 import java.util.Scanner; public class Main{ static int[] a = new int[1000]; public static void main(String

蓝桥杯——说好的进阶之多叉树的遍历

多叉树,简单地说,与二叉树类似的,但叉可能要多的树形结构:类似于计算机文件目录. static class MyTree { private Map map = new HashMap(); public void add(char parent, char child) { List<Character> t = (List<Character>) map.get(parent);// child list if (t == null) { t = new Vector<C

蓝桥杯——说好的进阶之全然背包问题

有N种物品和一个载重量为W的背包,每种物品都有无限件可用.第i种物品的重量是w,价值是p. 将哪些物品装入背包可使这些物品的重量总和不超过背包总重量,且价值总和最大.(对照01背包问题,取或不取与无限件) static int W=10; static int[] w_arr = new int[]{3,2,5,1,6,4}; static int[] p_arr = new int[]{6,5,10,2,16,8}; static int[][] v; public static void m

蓝桥杯 算法训练 ALGO-152 8-2求完数

算法训练 8-2求完数 时间限制:50.0s   内存限制:256.0MB 问题描述 如果一个自然数的所有小于自身的因子之和等于该数,则称为完数.设计算法,打印1-9999之间的所有完数. 样例输出 与上面的样例输入对应的输出.例: 数据规模和约定 1-9999 题目解析: 在求一个自然数的因子时,只需要循环的用该自然数与小于它的一半加一取余即可,这样可以将循环次数缩短 1 / 2 ,提高运行速度. 示例代码: 1 public class Main { 2 public static void