标签:乱搞 数学 博弈
取数游戏
CH Round #61 - 「Adera 10」冬令营热身赛
描述
SJY和CYF在玩一个取数游戏。他们将1~n分别写在n张纸上,随机排成一排,约定SJY先取,只能取走最边上的两张纸之一,然后CYF取;以此循环下去,取到1的人获胜。假设SJY和CYF足够聪明,求SJY获胜的概率。
输入
一个整数n
输出
SJY获胜的概率,保留最简分数形式(若为1,则输出1/1;若为0,则输出0/1)。
样例
样例输入1
2
样例输出1
1/1
样例输入2
3
样例输出2
2/3
数据范围与约定
40%的数据,0<n≤7。
70%的数据,0<n≤1000。
100%的数据,0<n≤1000000000。
样例2说明
共有1、2、3;1、3、2;2、1、3;2、3、1;3、1、2;3、2、1六种可能,其中第1、2、4、6种可能SJY获胜。
这道题是典型的数学题,可以直接寻找规律。首先根据题目说明,将7以内的情况都手算出来。1的时候是1,2的时候是1,3的时候是2/3,4的时候是1,5的时候是2/5,6的时候是1,7的时候是2/7。注意到,当n为偶数时概率为1,n为奇数是概率为2/n。这是不是一个普遍规律呢?数学证明这里略,我只说一下大体思路。
因为3和4好想,从3和4入手。
3的状态中有2/3为1在两端,此时为必胜状态,有1/3为1在两端,是必败状态,因为拿走一个后1一定会在两端。
4的状态中有1/2为1在两端,必胜,有1/2为1在中间,可以拿远离1的那一个数,使对方变成3中的必败状态*1*。
推测出当n为偶数时,要么直接拿走1,要么拿远离1的那一个,使对方变成必败状态,那么当n为偶数时必胜。
而当n为奇数时,除了1就在两端的情况,由于任意拿都不能拿到1,使对方成为偶数的必胜状态。
所以我们猜想的结论是完全正确的。
以后碰到这样的题,一定要先手算,然后敢猜敢写。
/*
Name:wxjlzbcd
Memory:1KB
Time:1ms
*/
#include<cstdio>
int n;
int main()
{
int i;
scanf("%d",&n);
if(n==1)
printf("1/1\n");
else
if(n&1)
printf("2/%d\n",n);
else
printf("1/1\n");
return 0;
}
【题解】CH Round #61 取数游戏
标签:乱搞 数学 博弈
原文地址:http://blog.csdn.net/wxjlzbcd/article/details/43541723