【BZOJ】1299: [LLH邀請賽]巧克力棒
阿新 • • 發佈:2017-07-25
-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 namespaceView Codestd; 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; }
【BZOJ】1299: [LLH邀請賽]巧克力棒