题解:
一道博弈论
题目要求取得最少,那么就是留下的最多
把石子从大到小排序
从打的开始刘
如果可以留,那么就留下了
如果留下了与前面留下来的异或后不为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"); }