您的位置:首页 > 其它

P1567 吃糖果游戏

2014-11-19 14:51 176 查看
原题:

描述

    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");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  博弈论