码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ 3105 新Nim游戏

时间:2017-01-17 13:53:25      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:string   tin   using   turn   zoj   efi   clu   bsp   nim游戏   

注意到线性基的非空子集的异或都不是0。

我们的目的就是消出这样一个线性基,是对面再怎么拿,异或和都是1。

从大到小排序消就好了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 105
using namespace std;
long long n,a[maxn],b[maxn],bit[32],ans=0,sum=0;
bool vis[32];
bool cmp(long long x,long long y)
{
    return x>y;
}
int main()
{
    scanf("%lld",&n);
    for (long long i=1;i<=n;i++) {scanf("%lld",&a[i]);sum+=a[i];}
    sort(a+1,a+n+1,cmp);
    for (long long i=1;i<=n;i++) b[i]=a[i];
    for (long long i=1;i<=n;i++)
        for (long long k=31;k>=0;k--)
        {
            if (!(a[i]&(1<<k))) continue;
            if (!vis[k]) 
                {vis[k]=true;ans+=b[i];bit[k]=a[i];break;}
            else a[i]^=bit[k];
        }
    printf("%lld\n",sum-ans);
    return 0;
}

 

BZOJ 3105 新Nim游戏

标签:string   tin   using   turn   zoj   efi   clu   bsp   nim游戏   

原文地址:http://www.cnblogs.com/ziliuziliu/p/6292576.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!