#4173. 取火柴游戏
取火柴游戏
当前没有测试数据。
问题描述
输入 k 及 k 个整数 n1, n2, ..., nk,表示有 k 堆火柴棒,第 i 堆火柴棒的根数为 ni。接着便是和计算机对弈游戏,取火柴的规则如下:每次可以从一堆中取走若干根火柴,也可以将一堆全部取走,但不允许跨堆取,也不允许不取。
谁取走最后一根火柴算谁胜利。
例如,k=2,n1=n2=2,A 代表你,P 代表计算机,若决定 A 先取:
A:(2, 2) → (1, 2) // 从一堆中取一根P:(1, 2) → (1, 1) // 从另一堆中取一根A:(1, 1) → (1, 0)P:(1, 0) → (0, 0) //P胜利
如果决定 A 后取:
P:(2, 2) → (2, 0)A:(2, 0) → (0, 0) //A胜利
又如 k=3,n1=1,n2=2,n3=3,A 决定后取:
P:(1, 2, 3) → (0, 2, 3)A:(0, 2, 3) → (0, 2, 2)
A 已将游戏归结为(2, 2)的情况,不管 P 如何取,A 都必胜。
输入格式
- 第一行输入一个整数
k,表示堆数。 - 第二行输入
k个整数n1, n2, ..., nk,表示每堆火柴棒的数量。
输出格式
- 输出一个字符串或一组数字:
- 如果存在必胜的策略,输出
第 1 次从第 i 堆取 x 个出来必胜,并给出每次取火柴后的状态。 - 如果先取必败,输出
lose。
- 如果存在必胜的策略,输出
输入样例
样例 1
3
3 6 9
样例 2
4
15 22 19 10
输出样例
样例 1
4 3
3 6 5
样例 2
lose
时间复杂度
- 每次递归检查所有的火柴堆和可能的取数,时间复杂度是
O(k * max(ni)),其中k是堆数,max(ni)是堆中最多的火柴数。
测试样例
输入 1
3
3 6 9
输出 1
4 3
3 6 5
输入 2
4
15 22 19 10
输出 2
lose