hdu 2176 取(m堆)石子游戏

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2176

博弈类题目,SG函数的应用(SG函数资料   http://hi.baidu.com/%BA%A3%CF%E0%C1%AC/blog/item/ac7a41133db9b84af819b8a8.html)

 

然后对于第二部分的解法,首先暴力肯定是通不过的。。。

我运用的应该是动态规划。   用一个数组存放下表x左边的所有数异或值l[x]和下标x的右边的r[x]的异或值,

然后对比就可以求出了。。

 

下面是AC代码:

#include<iostream>
using namespace std;
int a[200005];
int l[200005];
int r[200005];
int main()
{
	int m;
	int i;
	int t;
	while(cin>>m&&m)
	{
		
		for(i=1;i<=m;i++)
			cin>>a[i];
		t=a[1];

		for(i=2;i<=m;i++)
			t=t^a[i];

		if(t)
		{
			int temp;
			printf("Yes\n");

            l[1]=0;
			l[2]=a[1];
			for(i=3;i<=m+1;i++)
				l[i]=l[i-1]^a[i-1];

			r[m]=0;
			r[m-1]=a[m];

			for(i=m-2;i>=0;i--)
				r[i]=r[i+1]^a[i+1];

			for(i=1;i<=m;i++)
			{
				int k=a[i];
				if(i==1)
					temp=r[1];
				else if(i==m)
					temp=l[m];
				else
				{
					temp=l[i]^r[i];
				}

				if(k>temp)
					printf("%d %d\n",k,temp);
			}



		

		}
		else
			printf("No\n");

	}
	return 0;
}


 

你可能感兴趣的:(游戏,c)