原题:
描述
Matrix67和Shadow正在做一个小游戏。
桌子上放着两堆糖果,Matrix67和Shadow轮流对这些糖果进行操作。在每一次操作中,操作者需要吃掉其中一堆糖果,并且把另一堆糖果分成两堆(可以不相等)留给对方操作。游戏如此进行下去,糖果数会越来越少,最后必将出现这样一种情况:某人吃掉一堆糖果后发现另一堆里只剩一块糖果不能再分了。游戏规定此时该操作者吃掉最后这一块糖果从而取胜。
这个游戏是不公平的。对于任意一种初始状态,总有一方有必胜策略。所谓有必胜策略是指,无论对方如何操作,自己总有办法取胜。
Matrix67和Shadow将进行10次游戏,每一次游戏中总是Matrix67先进行操作。Matrix67想知道每一次游戏中谁有必胜策略。
桌子上放着两堆糖果,Matrix67和Shadow轮流对这些糖果进行操作。在每一次操作中,操作者需要吃掉其中一堆糖果,并且把另一堆糖果分成两堆(可以不相等)留给对方操作。游戏如此进行下去,糖果数会越来越少,最后必将出现这样一种情况:某人吃掉一堆糖果后发现另一堆里只剩一块糖果不能再分了。游戏规定此时该操作者吃掉最后这一块糖果从而取胜。
这个游戏是不公平的。对于任意一种初始状态,总有一方有必胜策略。所谓有必胜策略是指,无论对方如何操作,自己总有办法取胜。
Matrix67和Shadow将进行10次游戏,每一次游戏中总是Matrix67先进行操作。Matrix67想知道每一次游戏中谁有必胜策略。
输入格式
输入数据一共10行,每行有两个用空格隔开的正整数,表示一次游戏开始时桌子上两堆糖果分别有多少个。
对于50%的数据,这些正整数均不超过100;
对于70%的数据,这些正整数均不超过10 000;
对于100%的数据,这些正整数均不超过10 000位。
对于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代表必输) 认真看 答案很清楚了 -_- 好像有点骗分的性质呀
当你分的是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");
}
}