1. 程式人生 > >bzoj1299: [LLH邀請賽]巧克力棒 nim 小變形遊戲。

bzoj1299: [LLH邀請賽]巧克力棒 nim 小變形遊戲。

目錄

 

Description

Input

Output

Sample Input

Sample Output

HINT


Description

TBL和X用巧克力棒玩遊戲。每次一人可以從盒子裡取出若干條巧克力棒,或是將一根取出的巧克力棒吃掉正整數長度。TBL先手兩人輪流,無法操作的人輸。 他們以最佳策略一共進行了10輪(每次一盒)。你能預測勝負嗎?

Input

輸入資料共20行。 第2i-1行一個正整數Ni,表示第i輪巧克力棒的數目。 第2i行Ni個正整數Li,j,表示第i輪巧克力棒的長度。

Output

輸出資料共10行。 每行輸出“YES”或“NO”,表示TBL是否會贏。如果勝則輸出"NO",否則輸出"YES"

Sample Input

3
11 10 15
5
13 6 7 15 3
2
15 12
3
9 7 4
2
15 12
4
15 12 11 15
3
2 14 15
3
3 16 6
4
1 4 10 3
5
8 7 7 5 12

Sample Output

YES
NO
YES
YES
YES
NO
YES
YES
YES
NO

HINT

 

20%的分數,N<=5,L<=100。

40%的分數,N<=7。 50%的分數,L<=5,000。

100%的分數,N<=14,L<=1,000,000,000。

思路:  這個題面的描述有問題,直接看輸入輸出就行了。

這個題和 nim 差不多,

稍微帶一些變形。

就是把石頭拿走,我們首先要放幾堆石頭在這兒。

這樣的我們怎麼做呢?

我們知道nim遊戲,如果亦或和為0,那就必敗。

我們可以找一些堆石子,如果這些石子堆的亦或和為0,  那就先放下這些石子,這時候亦或和為0 的狀態就

轉移給了後手。

無論後手是拿走小石子,還是放下幾堆小石子,先手都有辦法可以使已經放下的石子堆的亦或和為0、

所以說,這些石子堆中如果有幾堆的石子亦或和為0,那就一定是先手贏,否則就是後手贏。 

#include<bits/stdc++.h>
using namespace std;
int n,tot;
bool vis;
int main(){
	int a[20];
	for (int T = 0; T < 10; T++){
		scanf("%d",&n);
		vis = 0;
		for (int i = 0; i < n; i++) scanf("%d",&a[i]);
		for (int i = 1; i <= (1 << n)- 1; i++){
			tot = 0;
			for (int j = 0; j < n; j++)
				if (i &(1 << j)) tot ^= a[j];
			if (tot == 0){ 
				vis = 1;
				break;
			}
		}
		if (vis) puts("NO"); else puts("YES");	
	}
	return 0;
}