bzoj1299: [LLH邀請賽]巧克力棒 nim 小變形遊戲。
阿新 • • 發佈:2018-11-27
目錄
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; }