博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ2940 条纹
阅读量:6708 次
发布时间:2019-06-25

本文共 1265 字,大约阅读时间需要 4 分钟。

条纹游戏是一个双人的游戏。所需要的物品有一个棋盘以及三种颜色的长方形条纹,这三种颜色分别是红色、绿色和蓝色。所有的红色条纹的尺寸是c*1,所有的绿色条纹的尺寸是z*1,所有的蓝色条纹的尺寸是n*1,这里c,z,n是正整数。每种颜色的条纹每个游戏者都拥有无限多个。
一个棋盘是一个尺寸为p*1的长方形,由p个1*1的方格组成。
游戏者轮流走,每一步都是由一个游戏者任选一种长方形条纹覆盖到棋盘上,并要求遵循以下规则:
条纹不能伸出棋盘之外。
不能覆盖在已有的条纹之上(即使部分也不行)。
条纹的边缘必须与棋盘方格的边缘相重叠。谁不能再走,谁就输了。
先手是指在游戏中第一个走的游戏者。那么是否不管后手怎么走,先手都有必胜策略呢?

解:暴力sg即可,发现复杂度是n²的。

1 #include 
2 3 const int N = 1010; 4 5 int bin[N], sg[N]; 6 7 int main() { 8 int a, b, c, n; 9 scanf("%d%d%d", &a, &b, &c);10 for(int i = std::min(std::min(a, b), c); i <= 1000; i++) {11 memset(bin, 0, sizeof(bin));12 for(int j = 0; j + a <= i; j++) {13 bin[sg[j] ^ sg[i - j - a]]++;14 }15 for(int j = 0; j + b <= i; j++) {16 bin[sg[j] ^ sg[i - j - b]]++;17 }18 for(int j = 0; j + c <= i; j++) {19 bin[sg[j] ^ sg[i - j - c]]++;20 }21 for(int j = 0; ; j++) {22 if(!bin[j]) {23 sg[i] = j;24 break;25 }26 }27 }28 29 scanf("%d", &n);30 for(int i = 1; i <= n; i++) {31 scanf("%d", &a);32 printf("%d\n", sg[a] ? 1 : 2);33 }34 35 return 0;36 }
AC代码

 

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

你可能感兴趣的文章
第4章 第一个程序
查看>>
JavaScript No Overloading 函数无重载之说
查看>>
vue2.0 子组件和父组件之间的传值
查看>>
WinForm下的键盘事件(KeyPress、KeyDown)及如何处理不响应键盘事件
查看>>
scp命令
查看>>
Asp.Net Core MVC控制器和视图之间传值
查看>>
Andriod开发技巧——Fragment的懒载入
查看>>
nyoj473 A^B Problem (高速幂)
查看>>
Eclipse + CDT引入OpenCV失败的解决的方法
查看>>
Ubuntu和Win7双系统,ubuntu被删,重新启动之后显示,no such partition
查看>>
<转载> MySQL 性能优化的最佳20多条经验分享 http://www.jb51.net/article/24392.htm
查看>>
用WebCollector爬取新浪微博数据
查看>>
codeforces Looksery Cup 2015 H Degenerate Matrix 二分 注意浮点数陷阱
查看>>
MySQL数据库管理(二)单机环境下MySQL Cluster的安装
查看>>
最简单的视音频播放示例7:SDL2播放RGB/YUV
查看>>
Oracle442个应用场景-----------Oracle数据库物理结构
查看>>
关于眼界、眼光、眼前的哪些....
查看>>
jQuery的Autocomplete插件的远程url取json数据的问题
查看>>
Mono源码学习笔记:Console类(四)
查看>>
Spring Security 入门(3-11)Spring Security 的使用-自定义登录验证和回调地址
查看>>