古时丧葬活动中经常请高僧做法事。仪式结束后,有时会有“高僧斗法”的趣味节目,以舒缓压抑的气氛。

节目大略步骤为:先用粮食(一般是稻米)在地上“画”出若干级台阶(表示N级浮屠)。又有若干小和尚随机地“站”在某个台阶上。最高一级台阶必须站人,其它任意。(如图1所示)

两位参加游戏的法师分别指挥某个小和尚向上走任意多级的台阶,但会被站在高级台阶上的小和尚阻挡,不能越过。两个小和尚也不能站在同一台阶,也不能向低级台阶移动。

两法师轮流发出指令,最后所有小和尚必然会都挤在高段台阶,再也不能向上移动。轮到哪个法师指挥时无法继续移动,则游戏结束,该法师认输。

对于已知的台阶数和小和尚的分布位置,请你计算先发指令的法师该如何决策才能保证胜出。

输入数据为一行用空格分开的N个整数,表示小和尚的位置。台阶序号从1算起,所以最后一个小和尚的位置即是台阶的总数。(N<100, 台阶总数<1000)

输出为一行用空格分开的两个整数: A B, 表示把A位置的小和尚移动到B位置。若有多个解,输出A值较小的解,若无解则输出-1。

例如:
用户输入:
1 5 9
则程序输出:
1 4

再如:
用户输入:
1 5 8 10
则程序输出:
1 3

尼姆博奕论

不清楚啥是尼姆游戏的可以先看一段视频:

尼姆游戏(学霸就是这样欺负人的)

这道题就是用的尼姆博弈,只要找到怎样改变使可移动的台阶数之间异或相加之后结果为0就是必赢局面,如果没有移动之前异或相加的值就是0,那么是必输局面。

构造nim模型为:从前到后每两个为一组,之间的距离-1构造为nim的一个堆。当堆之间异或为0时,输出-1,即无必胜技巧;当异或不为0时,暴力破解找到最小移动和尚的那步然后输出,此时注意移动一个和尚,当前和尚与上面一个和尚的距离减少,与下面一个和尚距离增加。

Code

if __name__ == '__main__':t, n = 0, list(map(int, input().split()))length = len(n)sub = [0] * lengthfor k in range(0, length, 2):if k > 1:sub[k - 2] = n[k - 1] - n[k - 2] - 1if k % 2 == 0:t ^= sub[k - 2]if not t:print(-1)else:for i in range(length - 1):for j in range(1, n[i + 1] - n[i]):sub[i] -= jif i:sub[i - 1] += jt = 0for m in range(0, length - 1, 2):t ^= sub[m]if t == 0:print(f'{n[i]} {n[i] + j}')breaksub[i] += jif i:sub[i - 1] -= j

不知道为啥,只能过两个评测。

2013\National _C_C++_B\4.高僧斗法相关推荐

  1. 2013\National _C_C++_B\2.连续奇数和

    小明看到一本书上写着:任何数字的立方都可以表示为连续奇数的和. 比如: 2^3 = 8 = 3 + 5 3^3 = 27 = 7 + 9 + 11 4^3 = 64 = 1 + 3 + - + 15 ...

  2. 2013\National _C_C++_B\1.猜灯谜

    A 村的元宵节灯会上有一迷题: 请猜谜 * 请猜谜 = 请边赏灯边猜 小明想,一定是每个汉字代表一个数字,不同的汉字代表不同的数字. 请你用计算机按小明的思路算一下,然后提交"请猜谜&quo ...

  3. 2019\National _C_C++_B\1.求2019<X<Y ,使2019*2019,X*X,Y*Y组成等差数列且X+Y最小.

    求2019<X<Y ,使20192019,XX,Y*Y组成等差数列且X+Y最小. 暴力 直接暴力循环出结果. Python def solve():for x in range(2020, ...

  4. 2013\National _C_C++_C\1.好好学习

    汤姆跟爷爷来中国旅游.一天,他帮助中国的小朋友贴标语. 他负责贴的标语是分别写在四块红纸上的四个大字:"好.好.学.习". 但是汤姆不认识汉字,他就想胡乱地贴成一行. 请你替小汤姆 ...

  5. 2013\National _C_C++_A\5.网络寻路

    X 国的一个网络使用若干条线路连接若干个节点.节点间的通信是双向的.某重要数据包,为了安全起见,必须恰好被转发两次到达目的地.该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径 ...

  6. 2013\National _C_C++_A\4.约数倍数选卡片

    闲暇时,福尔摩斯和华生玩一个游戏: 在N张卡片上写有N个整数.两人轮流拿走一张卡片.要求下一个人拿的数字一定是前一个人拿的数字的约数或倍数.例如,某次福尔摩斯拿走的卡片上写着数字"6&quo ...

  7. 2013\National _C_C++_A\2.骰子迷题

    小明参加了少年宫的一项趣味活动:每个小朋友发给一个空白的骰子(它的6个面是空白的,没有数字),要小朋友自己设计每个面写哪个数字.但有如下要求: 每个面只能填写 0 至 8 中的某一个数字. 不同面可以 ...

  8. 2013\National _C_C++_A\1.填算式

    请看下面的算式: (ABCD - EFGH) * XY = 900 每个字母代表一个0~9的数字,不同字母代表不同数字,首位不能为0. 比如,(5012 - 4987) * 36 就是一个解. 请找到 ...

  9. 2017/National _C_C++_B/2/磁砖样式

    标题:磁砖样式 小明家的一面装饰墙原来是 3*10 的小方格. 现在手头有一批刚好能盖住2个小方格的长方形瓷砖. 瓷砖只有两种颜色:黄色和橙色. 小明想知道,对于这么简陋的原料,可以贴出多少种不同的花 ...

最新文章

  1. [转载]Eclipse.ini的相关说明
  2. dataloader 源码_带你从零掌握迭代器及构建最简DataLoader
  3. 一步步用zTree(1)
  4. LeetCode 348. 判定井字棋胜负(计数)
  5. 【LeetCode】分类刷题 之 栈和队列
  6. 百万数据下几种SQL性能测试
  7. 夜间工作致癌的原因被发现:熬夜破坏了癌症相关基因的节律,导致DNA损伤增加、修复效率降低...
  8. python串口实时读取数据画图_python串口绘图
  9. 《Getting Started with WebRTC》第二章 WebRTC技术介绍
  10. Matlab中vpa一直在忙,matlab数据类型转换遇到问题,及解决办法,sym,double ,vpa转换...
  11. java变量命名规则_C++变量的命名规则
  12. VS编译器的简单操作
  13. 云计算、大数据在农业信息化中的应用
  14. Ms08067红队学员 “红蓝实战对抗”报告
  15. authorized_keys 不允许的操作
  16. 制作自己的标注数据集
  17. 苹果:第三方安装软件或导致严重隐私、安全风险
  18. 基于C语言编写的超市管理系统
  19. c语言程序中x>>=1是什么意思??
  20. vue2+vue3小白零基础教程—vue2篇,全网2021最详细教程

热门文章

  1. 【算法】螺旋方阵 上交OJ1021
  2. Spring MVC请求处理流程
  3. 面向对象编程,链式调用,先输出‘hello’,10秒之后,输出‘world’
  4. socket , 套接口还是套接字,傻傻分不清楚
  5. 前端--3、JavaScript
  6. webbrowser载入地图网页出现脚本错误解决
  7. TOMCAT虚拟路径配置
  8. sqlite3存储格式
  9. [转]创建一个JavaScript弹出DIV窗口层的效果
  10. 利用微软类库 Visual Studio International Pack 汉字转拼音