牛牛和羊羊都很喜欢青草。今天他们决定玩青草游戏。
最初有一个装有n份青草的箱子,牛牛和羊羊依次进行,牛牛先开始。在每个回合中,每个玩家必须吃一些箱子中的青草,所吃的青草份数必须是4的x次幂,比如1,4,16,64等等。不能在箱子中吃到有效份数青草的玩家落败。假定牛牛和羊羊都是按照最佳方法进行游戏,请输出胜利者的名字。
输入包括t+1行。 第一行包括一个整数t(1 ≤ t ≤ 100),表示情况数. 接下来t行每行一个n(1 ≤ n ≤ 10^9),表示青草份数
对于每一个n,如果牛牛胜利输出"niu",如果羊羊胜利输出"yang"。
3 1 2 3
niu yang niu
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int t = Integer.parseInt(br.readLine()); for(int i = 0; i < t; i++){ int n = Integer.parseInt(br.readLine()); System.out.println(winner(n)); } } private static String winner(int n) { if(n < 5) return n == 2? "yang": "niu"; int base = 1; // 牛牛不断尝试4的次方 while(base <= n){ // 牛牛吃base份然后往下扔给羊羊 if(winner(n - base).equals("yang")) return "niu"; // 防止乘以4后溢出 if(base > n / 4) break; base *= 4; } // 尝试了各种方案牛牛都没赢,则羊羊赢 return "yang"; } }结果第二个case上来就给我个上亿的数据量,直接导致栈溢出。没办法,只能用骚操作——打表法,先尝试一下1~50的情况,打印出了如下结果
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int t = Integer.parseInt(br.readLine()); for(int i = 0; i < t; i++){ int n = Integer.parseInt(br.readLine()); System.out.println(winner(n)); } } private static String winner(int n) { return (n % 5 == 0 || n % 5 == 2)? "yang": "niu"; } }像这种输入一个整数,输出也是一个整数的题目。左神表示大概3~4成的题目可以用这种方式找规律,刚开始不要纠结它的数学原理,只要这样暴力出来能AC,再去通过数学的方式解释这个策略。