这里以2018年全国多校算法寒假训练营练习比赛(第三场)之小牛vs小客为例。
题目链接:https://www.nowcoder.com/acm/contest/75/D
题目描述
小牛和小客玩石子游戏,他们用n个石子围成一圈,小牛和小客分别从其中取石子,谁先取完谁胜,每次可以从一圈中取一个或者相邻两个,每次都是小牛先取,请输出胜利者的名字(小牛获胜输出XiaoNiu,小客获胜输出XiaoKe)(1 2 3 4 取走 2 13 不算相邻)
输入描述:
输入包括多组测试数据 每组测试数据一个n(1≤n≤1e9)
输出描述:
每组用一行输出胜利者的名字(小牛获胜输出XiaoNiu,小客获胜输出XiaoKe)
示例1
输入
2 3
输出
XiaoNiu XiaoKe
解析:
这道题是一道简单的巴什博奕变形题,代码不难,难的是思想。这里每次都是小牛先取,倘若n小于等于2,小牛只需要把所有石子一次性取完便获胜。倘若 n == 3,小牛取1颗小客取2颗,小客胜;小牛取2颗小客取1颗,小客胜。倘若 n == 4,小牛取1颗,小客取斜对脚的1颗使剩余两颗不相邻,再然后小牛1颗,小客1颗,小客胜;小牛取两颗,小客取剩下两颗石子,小客胜。。。 由此可见,当 n > 3 时,只要小客第一次取时使剩余石子分为两堆,剩余石子按照小牛的取法镜像操作(小牛怎么取,小客便对应取和小牛相同数量的石子),那么最终一定是小客胜。故,当 n 小于等于2 时小牛胜,当 n > 2 时小客胜。
代码实现:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); while(input.hasNextInt()) { int n = input.nextInt(); if (n > 2) System.out.println("XiaoKe"); else System.out.println("XiaoNiu"); } } }
判题结果如下: