10.8

10.8

1.算法:

(1)肥猫的游戏 :

野猫与胖子,合起来简称肥猫,是一个班的同学,他们也都是数学高手,所以经常在一起讨论数学问题也就不足为奇了。一次,野猫遇到了一道有趣的几何游戏题目,便拿给胖子看。游戏要求在一个有n个顶点凸多边形上进行,这个凸多边形的n-3条对角线将多边形分成n-2个三角形,这n-3条对角线在多边形的顶点相交。三角形中的一个被染成黑色,其余是白色。双方轮流进行游戏,当轮到一方时,他必须沿着画好的对角线,从多边形上切下一个三角形。切下黑色三角形的一方获胜。胖子一看觉得确实很有趣,不如就一起玩玩吧。假设游戏由野猫先开始,那么野猫是否有必胜的策略呢?请写一个程序帮助野猫算一算。

做法:分三种情况,看看黑三角形和几个三角形相邻:

第一种:和一个三角形相邻:

则先手必胜

第二种:和两个三角形相邻:

规律如下:
n=5时 后手胜
n=6时 先胜…
即n为偶数时,先手胜,n为奇数时,后手胜

第三种情况:

n=5时 后手胜
n=6时 先胜…
即n为偶数时,先手胜,n为奇数时,后手胜(和情况而相同)

所以该题的解题思路是:判断黑三角形与几个白三角形相邻

注:如果白三角形的其中两个顶点与黑三角形中两个顶点一样,则与黑三角形相邻

(2)吃糖果游戏

Matrix67和Shadow正在做一个小游戏。
桌子上放着两堆糖果,Matrix67和Shadow轮流对这些糖果进行操作。在每一次操作中,操作者需要吃掉其中一堆糖果,并且把另一堆糖果分成两堆(可以不相等)留给对方操作。游戏如此进行下去,糖果数会越来越少,最后必将出现这样一种情况:某人吃掉一堆糖果后发现另一堆里只剩一块糖果不能再分了。游戏规定此时该操作者吃掉最后这一块糖果从而取胜。
  这个游戏是不公平的。对于任意一种初始状态,总有一方有必胜策略。所谓有必胜策略是指,无论对方如何操作,自己总有办法取胜。
  Matrix67和Shadow将进行10次游戏,每一次游戏中总是Matrix67先进行操作。Matrix67想知道每一次游戏中谁有必胜策略。

解题思路:找规律

解决这类题目的方法就是枚举讨论。
假设现在轮到你吃,摆在你面前的是糖果堆A和B。当你吃完堆A后,B将决定你的命运:
B = 1:先
B = 2:后
B = 3:后
B = 4=2+2:先
B=5 = 2 + 3:先
B=6 = 3 + 3:先
B = 7:后
B=8 = 1 + 7 = 2 + 6 = 3 + 5 = 4 + 4:后
B = 9:先
B=10 = 3 + 7 = 2 + 8:先
所以当b为1,4,5,6,9,10时先手胜
a为2,3,7,8时后手胜

观察集合a和b,我们可以发现每个b元素都能写成两个a元素之和对10求余的形式:
1 = (3 + 8) % 10; 4 = (2 + 2) % 10; 5 = (2 + 3) % 10; 6 = (3 + 3) % 10; 9 = (2 + 7) % 10; 10 = (3 + 7) % 10;

分三种情况:

(一)摆在你面前的两个堆的数量都可写为10 * i + a的形式,不管你吃掉哪一堆,留下的第二个数都是10 * i + a,这时你无论怎么分,分出来的两个数中肯定有一个可写为10 * i + b的形式,而10 * i + b = 10 * j + a + 10 * k + a,即两个数的个位数字都是集合a中的数,
这样经过一轮后,回到你手里的还是两个10 * i + a,你没办法赢。
(二)另外一种情况:摆在你面前的两个堆的数量都可写为10 * i + b的形式,这样不管你吃掉那一堆,都可以把剩下的一堆分成10 * i + b = 10 * j + a + 10 * k + a,这样送给对方的是两个10 * i + a,他输定了。
(三)最后一种情况:摆在你面前的一个堆的数量写为10 * i + a的形式,另一个堆的数量写为10 * j + b的形式,你把堆10 * i + a 吃掉,剩下的堆10 * j + b分成两个10 * i + a,稳操胜券。

(3)欧几里得的游戏

欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的。给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的数的正整数倍,当然,得到的数不能小于0。然后是Ollie,对刚才得到的数,和M,N中较小的那个数,再进行同样的操作……直到一个人得到了0,他就取得了胜利。下面是他们用(25,7)两个数游戏的过程:
Start:25 7
Stan:11 7
Ollie:4 7
Stan:4 3
Ollie:1 3
Stan:1 0
Stan赢得了游戏的胜利。

解题思路:
M比N大于等于2倍,则谁遇到这个谁获胜。
(1)如果一开始M就大于等于N的2倍,则Stan先手胜
(2)如果一开始M是N的一倍多,则一直操作下去,谁先遇到第(1)种情况,谁先获胜
(3)当M是N的一倍,即相等时,Stan先手胜

(4)Easy Selection

这个游戏是这样的,wind先写下一排数。既然是一排,当然有首尾咯。
wind和小杉(lolanv)每次只能从这排数的头或尾取一个数。
最后谁取的数的和多,谁就赢了。如果两人的和一样多,先取者胜。

有天swgr看到他们俩在玩这个游戏,很好奇。
他想知道,在两人总是做出最优决策的情况下(两个人的智商都是很高的……),
谁能取得最终的胜利呢?

解题思路:
很水的一道题,就是先手胜
先手可以决定尽量下次让后手取的数小于自己

int main()
{
    int k;
    scanf("%d",&k);
    int i=0;
    int m,n;
    for(i;i<k;i++){
        scanf("%d",&m);
        scanf("%d",&n);
        int j=0;
        int a[Max];
        for(j;j<m;j++){
            scanf("%d",&a[j]);
        }
        if(n==0){
            printf("wind\n");
        }
        else{
            printf("lolanv\n");
        }
    }
}

2.java中的大数:
分为大整数:BigInteger和大浮点数:BigDecimal
用法类似,以大整数为例:
(1)输入:
Scanner s=new Scanner(system.in);
BigInteger a=s.nextBigInteger();
BigInteger a=s.nextBigInteger();
(2)运算:
加法:a.add(b)
减法:a.subtract(b)
乘法:a.multiply(b)
除法:a.divide(b)
(3)转换:
1)和字符串的转换:
将字符串转换成大整数:
String ss=“123445”
BigInteger b=new BigInteger(ss); //将十进制的字符串数字转换成大整数
new BigInteger(ss,int radix);//将指定进制数的字符串数字转换成大整数

2)将int转换成BigInteger(两种方法):
第一种:
先转换成String,在转换成BigInteger
BigInteger b=new BigInteger(String.valueOf(5));
第二种:
BigInteger b=BigInteger.valueOf(5);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值