题目: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相关推荐

  1. Topcoder Srm 671 Div2 1000 BearDestroysDiv2

    \(>Topcoder \space Srm \space 671 \space Div2 \space 1000 \space BearDestroysDiv2<\) 题目大意 : 有一 ...

  2. 【TopCoder SRM 551 Div2】Solutions

    [250] Beaver Bindu has some colored bricks. Each color is described by an uppercase letter. Bricks o ...

  3. TopCoder SRM 558 Div 1 - Problem 1000 SurroundingGame

    传送门:https://284914869.github.io/AEoj/558.html 题目简述  一个人在一个n * m棋盘上玩游戏,想要占领一个格子有两个方法: 在这个格子放一个棋子.   这 ...

  4. topcoder srm 628 div2 250 500

    做了一道题,对了,但是还是掉分了. 第二道题也做了,但是没有交上,不知道对错. 后来交上以后发现少判断了一个条件,改过之后就对了. 第一道题爆搜的,有点麻烦了,其实几行代码就行. 250贴代码: 1 ...

  5. topcoder SRM 625 DIV2 IncrementingSequence

    由于题目数据量比较小,故可以开辟一个数组存储每个index出现的次数 然后遍历即可 string canItBeDone(int k, vector<int> A){vector<i ...

  6. TopCoder SRM 577 Div2 1000 EllysCoprimesDiv2

    今天不知道是网卡还是TC的问题一直爆炸,这题还是在vj上交的 插件再次神秘失踪 自己装了插件貌似哪里没弄好..反正很奇怪 辣鸡TC毁我青春 打CF去了 不太懂为什么这种题也是1000 // BEGIN ...

  7. Topcoder SRM 636 div2 1000

    可能个人的代码简写方式和大家的有点不同,读起来有点不适应,还望正在读此篇博客的acmer多多包涵! #include <cstdlib> #include <cctype> # ...

  8. Topcoder SRM 697题解

    Topcoder SRM 697题解 D1L1 分子分母同乘a[i]: \(a_{i}^{b_{i}+1} mod \prod a_i = 0\) 然后我们考虑质因子p,设质因子p在a[i]中出现cn ...

  9. TC SRM 655 Div1 Level 3 题解

    TC SRM 655 Div1 Level 3 题解 题目传送门 dp+几何 首先可以发现凸包是顺时针排列的一些线段构成的.我们可以预处理每一个蓝点是否都在一个线段 r [ i ] → r [ j ] ...

  10. PTA(Basic Level) 1024:科学计数法 (C语言实现)

    PTA(Basic Level) 1024:科学计数法 (C语言实现) 学习:正则表达式输入%[0-9],输入字符0-9,输入其他字符,则从此字符处被截断,如输入12345a123,则接受字符串为12 ...

最新文章

  1. Apache URL重定向避免网址结尾斜线问题
  2. golang goroutine 协程同步 sync.WaitGroup 简介
  3. makefile 和shell文件相互调用
  4. vbs复制自己到tmp目录
  5. 17届中职计算机应用基础,西安交通大学17年3月课程考试《计算机应用基础》作业考核试题...
  6. 微型计算机启天A5000-B124说明,微型计算机原理及应用知识点总结
  7. LeetCode—37. 解数独(困难)
  8. [转]Android产品研发(十九)
  9. java基础之匿名内部类
  10. mysql json数组拆分表_MaxCompute将json数组拆分成多行
  11. 201计算机基础知识,201年计算机应用基础备考练习题及答案
  12. Hadoop集成环境搭建
  13. bzoj 2656: [Zjoi2012]数列(sequence)(简单高精度模板2.0)
  14. mongodb sharding maintenance (分片维护1)
  15. RAID磁盘阵列相关技术详解
  16. MATLAB图像处理识别商品条形码、图像分割
  17. Python的三种代码续行书写方法
  18. 1028 大数乘法 V2(NTT or FTT)
  19. NXP-MPC5748G车载MCU使用(食用)方法(踩坑)实用指南(骗人教程)(三):MATLAB/SIMULINK生成代码给MPC5848G嵌入式处理器运行
  20. VC - vs2017里poco的websocket使用netssl

热门文章

  1. 联通软件研究院 软件开发校招一面面经
  2. 算法之《图》Java实现
  3. 基于JavaEE的网上企业办公自动化管理系统_JSP网站设计_SqlServer数据库设计目
  4. github100天python_GitHub - BigYoungs/Python-100-Days: Python - 100天从新手到大师
  5. Qt--改变鼠标形状
  6. Super Washing Machines
  7. 《Python计算机视觉》——基本的图像操作和处理
  8. Hotspot JVM manageable 参数列表
  9. 将自己在CSDN上的文章下载到本地并上传到掘金
  10. 一个好用的记事本备忘录微信小程序