欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ1299[LLH邀请赛]巧克力棒——Nim游戏+搜索

发布时间:2025/3/20 编程问答 46 豆豆
生活随笔 收集整理的这篇文章主要介绍了 BZOJ1299[LLH邀请赛]巧克力棒——Nim游戏+搜索 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

题目描述

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

输入

输入数据共20行。 第2i-1行一个正整数Ni,表示第i轮巧克力棒的数目。 第2i行Ni个正整数Li,j,表示第i轮巧克力棒的长度。

输出

输出数据共10行。 每行输出“YES”或“NO”,表示TBL是否会赢。如果胜则输出"NO",否则输出"YES"

样例输入

3
11 10 15
5
13 6 7 15 3
2
15 12
3
9 7 4
2
15 12
4
15 12 11 15
3
2 14 15
3
3 16 6
4
1 4 10 3
5
8 7 7 5 12

样例输出

YES
NO
YES
YES
YES
NO
YES
YES
YES
NO

提示

20%的分数,N<=5,L<=100。
40%的分数,N<=7。 50%的分数,L<=5,000。
100%的分数,N<=14,L<=1,000,000,000。

 

先手如果想赢只要第一次将最多的异或和为0的巧克力棒(即剩余的巧克力棒无论如何取都没有异或和为0的方案)都拿出来即可。这样先手就将必败态(异或和为0)留给了后手,后手无论是吃巧克力还是取巧克力都会将必胜态(异或和不为0)留给先手。那么只要搜索一下所有方案看是否有异或和为0的方案即可,因为有异或和为0的方案就说明先手能取最多异或和为0的巧克力棒。

#include<set> #include<map> #include<queue> #include<cmath> #include<stack> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long using namespace std; int T; int n; int a[20]; int ans; int num; void dfs(int dep,int x) {if(dep==n+1){if(num==1&&x==0){ans=1;}return ;}dfs(dep+1,x);num=1;dfs(dep+1,x^a[dep]); } int main() {T=10;while(T--){scanf("%d",&n);num=0;ans=0;for(int i=1;i<=n;i++){scanf("%d",&a[i]);}dfs(1,0);if(ans==0){printf("YES\n");}else{printf("NO\n");}} }

转载于:https://www.cnblogs.com/Khada-Jhin/p/9609654.html

总结

以上是生活随笔为你收集整理的BZOJ1299[LLH邀请赛]巧克力棒——Nim游戏+搜索的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。