博弈nim問題【洛谷P1247】
阿新 • • 發佈:2018-12-20
這個是個裸的nim吧,lose就判斷一下XOR的和是不是0。
關鍵是win的時候怎麼判斷取哪個。
這裡我不給出詳細的說明,總之就是,如果一個數和全部的異或和異或小於它本身,那麼就可以從他拿走了。
給程式碼吧:
博弈好難啊。這種題就是兩眼一抹黑。
#include <bits/stdc++.h> using namespace std; const int maxn = 5e5+7; int a[maxn]; int main() { int n; cin>>n; int ans = 0; int tmp = 0; for(int i=1;i<=n;i++) { cin>>a[i]; ans ^= a[i]; } if(ans) { for(int i=1;i<=n;i++) { if((a[i]^ans)<a[i]) { cout<<a[i]-(a[i]^ans)<<" "<<i<<endl; a[i] ^= ans; break; } } for(int i=1;i<=n;i++) { cout<<a[i]; if(i<n) { cout<<" "; } } cout<<endl; } else { cout<<"lose"<<endl; } return 0; }