藍橋杯 PREV-14 高僧鬥法(Nim遊戲)

題目鏈接:

http://lx.lanqiao.cn/problem.page?gpid=T37

思路:

1.假設從11開始給這nn個小和尚從左往右編號,那麼編號爲1,2,3,...,n1,2,3,...,n
2.我們按照一奇一偶的方式給他們組隊,結果爲(1,2),(3,4),...,(n1,n)(1,2),(3,4),...,(n-1,n)(1,2),(3,4),...(n2,n1),n(1,2),(3,4),...(n-2,n-1),n,我們可以知道每一個偶數都必定有一個奇數與它組隊;
3.每一隊,移動序號爲奇數的小和尚可以看成從這堆石子裏拿走一些石子,而移動序號爲偶數的小和尚可以看成從這堆石子裏添加一些石子;
4.此時問題就已經轉化成了Nim遊戲的一個小變形,算出對手的必敗態即可;

代碼:

#include<bits/stdc++.h>

using namespace std;

int n, sum, a[105]; 

int main() {
#ifdef MyTest
	freopen("Sakura.txt", "r", stdin);
#endif
	while(~scanf("%d", &a[n])) ++n;
	for(int i = 0; i + 1 < n; i += 2) {
		sum ^= a[i + 1] - a[i] - 1;
	}
	for(int i = 0; i + 1 < n; i += 2) {
		int d = a[i + 1] - a[i] - 1;
		if(d > (sum ^ d)) {
			printf("%d %d", a[i], a[i] + d - (sum ^ d));
			return 0;
		}
		int x = (sum ^ d) - d;
		if(i + 2 < n && x < a[i + 2] - a[i + 1]) {
			printf("%d %d", a[i + 1], a[i + 1] + x);
			return 0;
		}
	}
	puts("-1");
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章