BZOJ1299 巧克力棒

博客围绕TBL和X用巧克力棒玩的游戏展开,该游戏中两人轮流操作,无法操作者输,共进行10轮。解题思路是考虑先手第一步使当前SG为0且对方后续无法保持SG为0,可通过取出盒中异或为0的极大集合,若不存在则先手必败,还提到可用线性基求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题面:

TBL和X用巧克力棒玩游戏。每次一人可以从盒子里取出若干条巧克力棒,或是将一根取出的巧克力棒吃掉正整数长度。TBL先手两人轮流,无法操作的人输。 他们以最佳策略一共进行了10轮(每次一盒)。你能预测胜负吗?

如果胜则输出"NO",否则输出"YES"

解:Nim白学.......

考虑第一个人第一步要干什么能够必胜。显然他要取出一些使得当前SG为0,且接下来对方无法取出一些使得SG仍为0。

于是把盒中^起来为0的极大集合取出来就好了。

如果不存在这样的集合那么先手必败。

线性基即可。

 1 #include <bits/stdc++.h>
 2 
 3 const int N = 20;
 4 
 5 int b[32], a[N];
 6 
 7 inline void solve() {
 8     int n;
 9     scanf("%d", &n);
10     for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
11     for(int i = 1; i <= n; i++) {
12         int x = a[i];
13         bool fd = 0;
14         for(int j = 30; j >= 0; j--) {
15             if(!((x >> j) & 1)) continue;
16             if(b[j]) x ^= b[j];
17             else {
18                 b[j] = x;
19                 fd = 1;
20                 break;
21             }
22         }
23         if(!fd) {
24             printf("NO\n");
25             return;
26         }
27     }
28     printf("YES\n");
29     return;
30 }
31 
32 int main() {
33     int T = 10;
34     while(T--) {
35         solve();
36         if(T) memset(b, 0, sizeof(b));
37     }
38 
39     return 0;
40 }
AC代码

我一直想的是状压取了哪些然后暴力SG.....发现并不会

转载于:https://www.cnblogs.com/huyufeifei/p/10551609.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值