TopCoder SRM 558 DIV2 Level 3:CatAndRabbit
题目:http://community.topcoder.com/stat?c=problem_statement&pm=12187
题目大意:给定N个瓷砖(分为黑色和白色), A先走, A,B 轮流走,规则如下:选择一个黑色瓷砖,选择向左还是向右走X步(X为任意步,只能走在黑色瓷砖上),每走过一步将白色瓷砖反转至黑色瓷砖。如果没有白色瓷砖,则判为负。 给定N个瓷砖的分布,求A赢还是B赢。1<=N<=50
解题思路:
刚看到题目,觉得这是个典型的博弈论问题。必胜态: 存在一步操作使得状态变为必败态; 必败态:所以的有效操作都能到必胜态。所以觉得采用动态规划求解,但是时间复杂度较高,O(N * 2^N).
后来看解题报告:http://apps.topcoder.com/wiki/display/tc/SRM+558
假设白色瓷砖为1,黑色瓷砖为0,白色瓷砖将黑色瓷砖分为若干个连续的子段,即A1, A2, ...,Ak. 那么一步有效操作变为:从A1,A2, ...,Ak中选择一个Ai, 减去x个1。
所以该问题转化为博弈论中典型问题NIM问题: http://en.wikipedia.org/wiki/Nim
结论:XOR操作为异或操作, 如果p = A1 xor A1 xor A2, ... ,xor Ak 不等于0, 那么该状态为先手的必胜态,否则为必败态。
为什么?必胜态: 存在一步操作使得状态变为必败态; 必败态:所以的有效操作都能到必胜态。
当A1=A2=,...,=Ak=0时,p= 0, 记为状态S0, 显然是个必败态, 则上一个任意能到S0的状态为必胜状态,此时p必不等于0.
反之当p!=0时, 总存在一次步骤将下一个状态的p变为0. 为什么? 来证明一下,假设p= A1 xor A1 xor A2, ... ,xor Ak 不等于0,则二进制表示为: bq,bq-1,...,b0, bq = 1, q为二进制最高位为1的长度。 则A1,A2,...,Ak中至少存在Ai,其q位为1的,否则bq不可能等于1. 如果将Ai变为Ai', Ai'的q位置为0,q-1,q-2,...,0位分别置为bq-1',bq-2',...,b0'. 其中bq-1',bq-2',...,b0' = p的q-1,q-2,...,0 XOR Ai的q-1,q-2,...,0
显然 Ai' < Ai, 符合操作规则, 使得只需要操作一步将p!=0 变为0.
C
#include <string>using namespace std;class CatAndRabbit {
public:string getWinner(string tiles) {//avoid a speciall case when the Cat cannot move at the first time.if (tiles.find('#') == string::npos) return "Rabbit";//calculate the sum xor of all the consecutive-white-tile segments.int sum_xor = 0, pr = 0;for (int i = 0; i < tiles.size(); i++)if (tiles[i] == '.') pr++;else sum_xor ^= pr, pr = 0;sum_xor ^= pr;//Cat will lose when sum_xor > 0;return sum_xor? "Cat": "Rabbit";}
};
++ Code (解题报告)
TopCoder SRM 558 DIV2 Level 3:CatAndRabbit相关推荐
- Topcoder Srm 671 Div2 1000 BearDestroysDiv2
\(>Topcoder \space Srm \space 671 \space Div2 \space 1000 \space BearDestroysDiv2<\) 题目大意 : 有一 ...
- 【TopCoder SRM 551 Div2】Solutions
[250] Beaver Bindu has some colored bricks. Each color is described by an uppercase letter. Bricks o ...
- TopCoder SRM 558 Div 1 - Problem 1000 SurroundingGame
传送门:https://284914869.github.io/AEoj/558.html 题目简述 一个人在一个n * m棋盘上玩游戏,想要占领一个格子有两个方法: 在这个格子放一个棋子. 这 ...
- topcoder srm 628 div2 250 500
做了一道题,对了,但是还是掉分了. 第二道题也做了,但是没有交上,不知道对错. 后来交上以后发现少判断了一个条件,改过之后就对了. 第一道题爆搜的,有点麻烦了,其实几行代码就行. 250贴代码: 1 ...
- topcoder SRM 625 DIV2 IncrementingSequence
由于题目数据量比较小,故可以开辟一个数组存储每个index出现的次数 然后遍历即可 string canItBeDone(int k, vector<int> A){vector<i ...
- TopCoder SRM 577 Div2 1000 EllysCoprimesDiv2
今天不知道是网卡还是TC的问题一直爆炸,这题还是在vj上交的 插件再次神秘失踪 自己装了插件貌似哪里没弄好..反正很奇怪 辣鸡TC毁我青春 打CF去了 不太懂为什么这种题也是1000 // BEGIN ...
- Topcoder SRM 636 div2 1000
可能个人的代码简写方式和大家的有点不同,读起来有点不适应,还望正在读此篇博客的acmer多多包涵! #include <cstdlib> #include <cctype> # ...
- Topcoder SRM 697题解
Topcoder SRM 697题解 D1L1 分子分母同乘a[i]: \(a_{i}^{b_{i}+1} mod \prod a_i = 0\) 然后我们考虑质因子p,设质因子p在a[i]中出现cn ...
- TC SRM 655 Div1 Level 3 题解
TC SRM 655 Div1 Level 3 题解 题目传送门 dp+几何 首先可以发现凸包是顺时针排列的一些线段构成的.我们可以预处理每一个蓝点是否都在一个线段 r [ i ] → r [ j ] ...
- PTA(Basic Level) 1024:科学计数法 (C语言实现)
PTA(Basic Level) 1024:科学计数法 (C语言实现) 学习:正则表达式输入%[0-9],输入字符0-9,输入其他字符,则从此字符处被截断,如输入12345a123,则接受字符串为12 ...
最新文章
- Apache URL重定向避免网址结尾斜线问题
- golang goroutine 协程同步 sync.WaitGroup 简介
- makefile 和shell文件相互调用
- vbs复制自己到tmp目录
- 17届中职计算机应用基础,西安交通大学17年3月课程考试《计算机应用基础》作业考核试题...
- 微型计算机启天A5000-B124说明,微型计算机原理及应用知识点总结
- LeetCode—37. 解数独(困难)
- [转]Android产品研发(十九)
- java基础之匿名内部类
- mysql json数组拆分表_MaxCompute将json数组拆分成多行
- 201计算机基础知识,201年计算机应用基础备考练习题及答案
- Hadoop集成环境搭建
- bzoj 2656: [Zjoi2012]数列(sequence)(简单高精度模板2.0)
- mongodb sharding maintenance (分片维护1)
- RAID磁盘阵列相关技术详解
- MATLAB图像处理识别商品条形码、图像分割
- Python的三种代码续行书写方法
- 1028 大数乘法 V2(NTT or FTT)
- NXP-MPC5748G车载MCU使用(食用)方法(踩坑)实用指南(骗人教程)(三):MATLAB/SIMULINK生成代码给MPC5848G嵌入式处理器运行
- VC - vs2017里poco的websocket使用netssl
热门文章
- 联通软件研究院 软件开发校招一面面经
- 算法之《图》Java实现
- 基于JavaEE的网上企业办公自动化管理系统_JSP网站设计_SqlServer数据库设计目
- github100天python_GitHub - BigYoungs/Python-100-Days: Python - 100天从新手到大师
- Qt--改变鼠标形状
- Super Washing Machines
- 《Python计算机视觉》——基本的图像操作和处理
- Hotspot JVM manageable 参数列表
- 将自己在CSDN上的文章下载到本地并上传到掘金
- 一个好用的记事本备忘录微信小程序