正题
题目链接:https://www.luogu.com.cn/problem/P4301
题目大意
nnn个石头,先手先取走若干堆(不能全取,可以不取),后手取走若干堆(不能全取,可以不取)。然后进行NimNimNim游戏,要求先手游戏前取的最少石头且必胜。
解题思路
做了这么多题大概摸清思路了。NimNimNim游戏的先手必胜条件是所有石头异或起来不为000,那么我们第一次取之后就要求后手无法取走若干堆使得它们异或和为000。
也就是要求取走最少的石头使得剩下的石头中取出若干堆的异或和都不为000。那我们就可以从大到小排序石头,然后依次插入,将无法插入的统计入答案即可。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,a[110],d[80];
long long ans;
bool add(int x){for(int i=30;i>=0;i--)if((x>>i)&1){if(d[i])x^=d[i];else{d[i]=x;return x==0;}}return 1;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);sort(a+1,a+1+n);for(int i=n;i>=1;i--)ans+=a[i]*add(a[i]);printf("%lld",ans);
}