【蓝桥java】进制与整除之尼姆堆
题目:
有3堆硬币,分别是3,4,5
二人轮流取硬币。
每人每次只能从某一堆上取任意数量。
不能弃权。
取到最后一枚硬币的为赢家。求先取硬币一方有无必胜的招法。
在提供代买前做几条补充:
(1)这里有一个不是很好理解的规律,就是如果各个堆的硬币数目相异或得到的是0,那么你就处于必输的状态。
(2)如果你的异或结果不为零,那么你一定有方法可以取一次就使对方的异或结果为0
(3)为了使对方的异或结果为0,我们可以改变哪个数字呢?
我们可以选择异或结果最高位的1的贡献者,如图,第二 三 四个数都可以
(4)实际操作的时候我们用不着像(3)说的那么麻烦,异或有很好的数学特性,比如一个数与另一个数异或两次得到的就是它本身,因此我们可以将得到的异或结果与其中的一个值a异或,得到剩余几个数的异或结果x,再使用这个结果x替换a,因此替换过后的四个数异或一定为0,因为异或的结果就是剩余三个数的异或与自身异或。
注:
1)我对这个“必输”的理解是,对方有方法使你一定输,也就是说如果对方选择得当那么你一定输,而不是无论如何你一定输。
2)我试着用我的理解解释一下这种现象:如果你处于异或结果为0的状态,那么你无法在你取完之后使硬币异或结果为零,也就是说对方取的时候异或结果一定不为零,此时对方就有方法使下一次你取的时候异或结果为零,如此循环最终你取的时候的结果会是一堆0相异或,也就是说在此之前对方已经取完了最后一次,你已经输了。
代码实现:
package cn.zzunit.jnvi;
/*** 有3堆硬币,分别是3,4,5
二人轮流取硬币。
每人每次只能从某一堆上取任意数量。
不能弃权。
取到最后一枚硬币的为赢家。求先取硬币一方有无必胜的招法。* @author tyrantForever**/
public class Project2 {public static void main(String[] args) {int[] a = {3, 4, 5};findMethord(a);}//用于找到先取硬币的人的必胜走法public static void findMethord(int[] a) {int sum = a[0];for(int i = 1; i < a.length; i++) {sum ^= a[i];}if(sum == 0) {System.out.println("输!");}else {for(int i = 0; i < a.length; i++) {int x = sum ^ a[i];if(x < a[i]) {System.out.println(a[i] + "--->" + x);}}}}}
注:
(1)还需要考虑替换后x的值一定要小于原本的数目,否则不合要求。
【蓝桥java】进制与整除之尼姆堆相关推荐
- java进制转换代码
java进制转换代 定义十进制的数直接写,定义8进制的数以0开头,定义二进制的数以0b开头,定义十六进制的数以0x开头 需要将十进制的数以二进制的数表示出来可以参照下例: int a = 10; Sy ...
- java进制转换界面,java进制转换器 图形用户界面 十进制及其相反数诀别转化为二,四,八,十六进制...
java进制转换器 图形用户界面 十进制及其相反数分别转化为二,四,八,十六进制 package com.rgy.Test; import java.awt.Color; import java.aw ...
- Java算法学习:java进制转换(十进制转八进制,十进制转二进制,十六进制转八进制)
java进制转换(十进制转八进制,十进制转二进制,十六进制转八进制) 这几天在复习C语言的数据结构栈和队列那一章的时候,看到利用栈的特性FILO实现的进制转换十分简洁 想起了java中实现栈的操作十分 ...
- Java进制转换(二进制、八进制、十进制、十六进制)
Java进制转换(二进制.八进制.十进制.十六进制) 1. 二进制转其它进制 二进制转八进制 String i="1001";System.out.println(Integer. ...
- 【蓝桥java】进制与整除之天平秤重
题目: 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量. 如果只有5个砝码,重量分别是1,3,9,27,81 则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中). ...
- java 进制转换,二进制 十进制 十六进制 正数 负数的进制等等!
2进制CPU使用,8进制很少见,10进制适合人类使用,16进制适合编译器和底层程序员使用,希望对你有所帮助! 以下文章是自己从别的地方复制粘贴过来, 总结了一下. 虽然看着有点乱, 但是想学 ,就能看 ...
- java进制转化_【Java学习笔记之四】java进制转化
十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...
- 【Java学习笔记之四】java进制转化
十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...
- java 进制转换 十进制转二,八,十六进制
十进制转其他进制 因为在java中位运算符是直接对数值的二进制数进行操作的 并且 写的是二进制数在输出和操作时是以十进制数的形式: 所以十进制转二,八,十六进制:就已经实现了二进制,八进制,十进制,十 ...
最新文章
- 你所不知道的库存超限做法
- 使用sqlmap直连数据库获取webshell
- CloudStack学习-1
- python自动化测试数据驱动_Python 自动化测试(四):数据驱动
- Leetcode 560. Subarray Sum Equals K
- python中的函数修饰符
- TreeMap源码分析——深入分析(基于JDK1.6)
- ADB wifi调试步骤
- iphone短信尚未送达_iPhone开启这个功能,从此告别垃圾短信骚扰!
- pip修改下载源为国内源 linux系统
- python模块下载失败_ubuntu16.04安装python的requests模块失败,怎么解决?
- sap系统搭建教程_SAP系统和微信集成的系列教程之十:如何在SAP C4C系统里直接回复消息给微信用户...
- Bluetooth的profile总结
- keytool条目_keytool常用命令
- Win11查看本机WiFi密码
- android机器人方向,Android横版过关类游戏推荐《机器人大挑战》
- 关闭微信内置浏览器页面
- 微信缓存dat怎么转图片_微信dat文件转换为图片
- 微信小程序获取页面高度
- 点击修改用户图像php类,php修改图像