B1299 [LLH邀请赛]巧克力棒 博弈论
2024-08-30 23:53:16
这个题一看就是nim游戏的变形。每次先手取出巧克力就是新建一个nim,但假如先手取一个为0的而且无论后手怎么取剩下的都无法为零就行了。然后用dfs跑。
题干:
Description TBL和X用巧克力棒玩游戏。每次一人可以从盒子里取出若干条巧克力棒,或是将一根取出的巧克力棒吃掉正整数长度。TBL先手两人轮流,无法操作的人输。 他们以最佳策略一共进行了10轮(每次一盒)。你能预测胜负吗?
Input 输入数据共20行。 第2i-1行一个正整数Ni,表示第i轮巧克力棒的数目。 第2i行Ni个正整数Li,j,表示第i轮巧克力棒的长度。
Output 输出数据共10行。 每行输出“YES”或“NO”,表示TBL是否会赢。如果胜则输出"NO",否则输出"YES"
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(int i = a;i <= n;i++)
#define lv(i,a,n) for(int i = a;i >= n;i--)
#define clean(a) memset(a,0,sizeof(a))
const int INF = << ;
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{
char c;
bool op = ;
while(c = getchar(), c < '' || c > '')
if(c == '-') op = ;
x = c - '';
while(c = getchar(), c >= '' && c <= '')
x = x * + c - '';
if(op) x = -x;
}
template <class T>
void write(T x)
{
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar('' + x % );
}
int n,sg[],a[],found;
void dfs(int x,int used,int now)
{
if(x == n + )
{
if(!now && used > ) found = ;
return;
}
dfs(x + ,used,now);
dfs(x + ,used + ,now ^ a[x]);
}
int main()
{
int k = ;
while(k--)
{
memset(sg,-,sizeof(sg));
found = ;
read(n);
duke(i,,n)
read(a[i]);
dfs(,,);
if(found == )
printf("NO\n");
else
printf("YES\n");
}
return ;
}
最新文章
- Menu与ActionBar的爱恨情仇
- ECMAScript 5中属性的特性值
- IE9,10中console对象的bug
- Xcode编程环境经验笔记(持续汇总)
- APP设计尺寸规范大全,APP界面设计新手教程【官方版】(转)
- Java设计模式—生产者消费者模式(阻塞队列实现)
- [python 2.7.5] 实现配置文件的读写
- Hibernate HQL查询的参数绑定
- 拔高你的Java代码质量吧:推荐使用枚举定义常量(转)
- 【AC自动机】专题总结
- redhat ping不通外网的解决办法
- Linux运行C#程序
- UVA - 10131Is Bigger Smarter?(DAG上的DP)
- 目前所有的ANN神经网络算法大全
- Java反射机制示例
- 【一天一道LeetCode】#292. Nim Game
- 在线数据库表(sql语句)生成java实体类工具
- C语言随机点名程序
- 系统不支持WP开发
- flex布局下, 内容改变 不重新渲染问题