1. 程式人生 > >博弈nim問題【洛谷P1247】

博弈nim問題【洛谷P1247】

這個是個裸的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;
}