正题
题目链接:https://www.luogu.com.cn/problem/P4301
题目大意
n
n
n个石头,先手先取走若干堆(不能全取,可以不取),后手取走若干堆(不能全取,可以不取)。然后进行
N
i
m
Nim
Nim游戏,要求先手游戏前取的最少石头且必胜。
解题思路
做了这么多题大概摸清思路了。
N
i
m
Nim
Nim游戏的先手必胜条件是所有石头异或起来不为
0
0
0,那么我们第一次取之后就要求后手无法取走若干堆使得它们异或和为
0
0
0。
也就是要求取走最少的石头使得剩下的石头中取出若干堆的异或和都不为
0
0
0。那我们就可以从大到小排序石头,然后依次插入,将无法插入的统计入答案即可。
c
o
d
e
code
code
#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
);
}