P1567 吃糖果游戏

原题:

描述

    Matrix67和Shadow正在做一个小游戏。
    桌子上放着两堆糖果,Matrix67和Shadow轮流对这些糖果进行操作。在每一次操作中,操作者需要吃掉其中一堆糖果,并且把另一堆糖果分成两堆(可以不相等)留给对方操作。游戏如此进行下去,糖果数会越来越少,最后必将出现这样一种情况:某人吃掉一堆糖果后发现另一堆里只剩一块糖果不能再分了。游戏规定此时该操作者吃掉最后这一块糖果从而取胜。
    这个游戏是不公平的。对于任意一种初始状态,总有一方有必胜策略。所谓有必胜策略是指,无论对方如何操作,自己总有办法取胜。
    Matrix67和Shadow将进行10次游戏,每一次游戏中总是Matrix67先进行操作。Matrix67想知道每一次游戏中谁有必胜策略。

输入格式

    输入数据一共10行,每行有两个用空格隔开的正整数,表示一次游戏开始时桌子上两堆糖果分别有多少个。
    对于50%的数据,这些正整数均不超过100;
    对于70%的数据,这些正整数均不超过10 000;
    对于100%的数据,这些正整数均不超过10 000位。

输出格式

    输出十行字符串。这些字符串只能是“Matrix67”或“Shadow”,它们表示对应的十行输入数据中有必胜策略的一方。
    请注意大小写。

测试样例1

输入

1 1 
1 2 
1 3 
1 4 
1 5 
2 1 
2 2 
2 3 
2 4 
2 5

输出

Matrix67 
Matrix67 
Matrix67 
Matrix67 
Matrix67 
Matrix67 
Shadow 
Shadow 
Matrix67 
Matrix67
一部分的解题思路:

标签: 

解题思路

当你要分的那一组是2,3时,必败,因为你必须分出个1。
当你分的是7,8时,也必败,因为
7=2+5或者3+4 8=2+6或者3+5或者4+4,这时对方下一步就能分给你2或者3,所以必败。
设a=[2,3,7,8]
设b=[1,4,5,6,9,10]
如果两个数都可写为10i+a的形式,设吃掉了第一个数,留下的第二个数10i+a,这时你无论怎么分,分出来的两个数一定有一个属于10i+b的形式。
而我们发现每个b都能写成两个a的形式。
1=3+8 4=2+2 5=2+3 6=3+3 9=2+7 10=2+8
因此如果两个数都是10i+a的形式,经过一轮之后回到手里的还是10i+a,所以必败。
但如果两个数中有一个数不是10i+a,这时可以把另外一个吃掉,然后把这个数分成两个10i+a,这时对方必败。
因此得出结论:如果两个数的末尾都属于a,Matrix67必败,否则Matrix67胜。
//====================================================挺起的分割线
一开始觉得很难 写个爆搜 输出20内的数据
22222222222222222222
21122211222112221122
21122211222112221122
22222222222222222222
22222222222222222222
22222222222222222222
21122211222112221122
21122211222112221122
22222222222222222222
22222222222222222222
22222222222222222222
21122211222112221122
21122211222112221122
22222222222222222222
22222222222222222222
22222222222222222222
21122211222112221122
21122211222112221122
22222222222222222222
22222222222222222222
(2代表比赢 1代表必输) 认真看 答案很清楚了 -_-  好像有点骗分的性质呀
转自:吃糖果游戏

这属于博弈论的知识,通过例子与找规律,并且从1开始去分析,从中的答案去推出相应的规律。一下是有种方法解题:其中一个找到对5取余数,余数为2/3的就必输,太刁了。

import java.util.Scanner;

public class Main{
	public static void main(String[] args){
		
		Scanner scanner=new Scanner(System.in);
		while(scanner.hasNext()){
			int a=scanner.nextInt();
			int b=scanner.nextInt();
			new Main().solve(a, b);
			
		}
	}
	//方法一
	public void solve(int a,int b){
		int[] as=new int[]{2,3,7,8};
		int[] bs=new int[]{1,4,5,6,9,10};
		int modA=a%10;
		int modB=b%10;
		int i=0;
		for(i=0;i<bs.length;i++){
			if(bs[i]==modA||bs[i]==modB){
				System.out.println("Matrix67");
				break;
			}
		}
		if(i==bs.length)
			System.out.println("Shadow");
	}
	//方法二:会发现a/b处于5的时候,余数为2/3的时候,shadow赢
	public void solve2(int a,int b){
		
		if(a%5==2||a%5==3||b%5==2||b%5==3)
			System.out.println("Shadow");
		else
			System.out.println("Matrix67");
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值