1. 程式人生 > >【BZOJ】1299: [LLH邀請賽]巧克力棒

【BZOJ】1299: [LLH邀請賽]巧克力棒

-a main ring bool include 我們 i++ color name

【算法】博弈論

【題解】這道題不是典型的SG函數題了。

不把它當成遊戲看待,那麽這道題是在說n個石子堆,每次可以加入若幹個或進行Nim遊戲。

我們當前先手,則考慮構造必敗態來獲勝。

當前已加入的NIm遊戲SG=0,則必須考慮加入石子堆,若加入m堆構造出SG=0,對方有兩種選擇:

加入新的石子堆,則必須是SG=0。

進行Nim遊戲,但是目前SG=0,先手必敗。

所以只要把n堆中異或和=0的最長子序列在第一次操作時移入即可先手必勝。

技術分享
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace
std; int a[20],n,tot; bool dfs(int x,int ans) { if(x==n+1) { if((!ans)&&tot)return 1; return 0;//!!! } else { tot++; bool ok=dfs(x+1,ans^a[x]); tot--; if(!ok)ok=dfs(x+1,ans); return ok; } } int main() { int T=10
; while(T--) { scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); tot=0; if(dfs(1,0))printf("NO\n");else printf("YES\n"); } return 0; }
View Code

【BZOJ】1299: [LLH邀請賽]巧克力棒