您好,欢迎来到步遥情感网。
搜索
您的当前位置:首页【HDU 2176】 取(m堆)石子游戏

【HDU 2176】 取(m堆)石子游戏

来源:步遥情感网

【题目链接】

           

【算法】

           Nim博弈

           当石子数异或和不为0时,先手必胜,否则先手必败

           设石子异或和为S

           如果S xor ai <= ai,那么,第一步就可以从第i堆石子中取走(S xor ai)个石子

【代码】

           

#include<bits/stdc++.h>
using namespace std;
#define MAXM 200010

int i,m,k,sum;
int a[MAXM];

int main() 
{
        
        while (scanf("%d",&m) && m)
        {
                sum = 0;
                for (i = 1; i <= m; i++)    
                {
                        scanf("%d",&a[i]);
                        sum ^= a[i];        
                }    
                if (sum != 0)
                {
                        printf("Yes\n");
                        for (i = 20; i >= 0; i--)
                        {
                                if (sum & (1 << i))
                                {
                                        k = i;
                                        break;
                                }
                        }
                        for (i = 1; i <= m; i++)
                        {
                                if ((sum ^ a[i]) <= a[i])
                                        printf("%d %d\n",a[i],sum^a[i]);
                        }
                } else printf("No\n");
        }
        
        return 0;
    
}

 

转载于:https://www.cnblogs.com/evenbao/p/9301950.html

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- obuygou.com 版权所有 赣ICP备2024042798号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务