题解:

一道博弈论

题目要求取得最少,那么就是留下的最多

把石子从大到小排序

从打的开始刘

如果可以留,那么就留下了

如果留下了与前面留下来的异或后不为0,那么就可以留

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll tot,ans;
int n,top,a[105],b[35],q[105];
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    for (int i=1;i<=n;i++)tot+=a[i];
    for (int i=n;i;i--)
     {
        int t=a[i];
        for (int j=30;j>=0;j--)
         if (a[i]&(1<<j))
          {
            if (!b[j])
             {
                b[j]=i;
                break;
             }
            else a[i]^=a[b[j]];
          }
        if (a[i])ans+=t;
     }
    if (ans!=0)printf("%lld\n",tot-ans);
    else puts("-1"); 
}

 

posted on 2017-11-04 21:31  宣毅鸣  阅读(117)  评论(0编辑  收藏  举报