简单博弈

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单博弈相关的知识,希望对你有一定的参考价值。

                      题目描述

  话说,小C经过上次被小T实力坑了一把以后呀,他就决定发明一个数字游戏来坑一坑小T!游戏规则是这样~

在游戏开始前,小C会任意的选出一个正整数n(1≤n≤2^32-1),同时令m=1。在玩的过程当中,小C和小T每个人都可以将m的值扩大2到9中的任意倍数(倍数一定是整数),两个人一人扩大一次,第一个使m≥n的人就是最后的赢家。

因为两个人都在互相算计,所以都是用的最佳策略,问最后是谁赢?

(上次因为吃了先手的亏,小C决定先手,也就是说:每次都是小C第一个玩)。

输入

多组输入(文件尾结束)

每行一个正整数n

输出

对于每个结果:

如果小C赢,则输出"C",

如果小T赢,则输出"T"。

(记得换行!!)

样例输入
9
样例输出
C

思路: 

如果先手可以到达终止局面,直接跳终止局面获得胜利 

否则,把对手推到必败局面,相当于获得胜利! 

思路很简单,关键在找必败局面: 

把问题稍微转换一下,便于找必败局面: 把m每次乘以2-9直到大于等于n -> 把n每次除以2-9(向上取整)直到n<=1为获胜; 

那么可以一次到达目标的必胜局区间是[1,9] ,第一个必败局面是(9,18],因为除9达不到1,除其他数对手必胜; 

同理可以一次到达(9-18]的必胜局的区间是(19,18*9] ,再推一个必败局(18*9,18*9*2],

再推一个必胜局[18*9*2+1,18*9*2*9] ,再推一个必败局(18*9*2*9,18*9*2*9*2]

必胜局:(18^n,18^n*9]...

 1 #include "cstdio"
 2 #include "algorithm"
 3 #include "cstring"
 4 #include "cmath"
 5 long long a[10],b[10];
 6 int main()
 7 {
 8     int n,cnt=0;
 9     long long m,s;
10     s=(long long )(pow(2,32)-1);
11     a[0]=1,b[0]=9;
12     for(int i=1;i<10;i++){
13         m=(long long)(pow(18,i));
14         if(m<=s){
15             a[i]=m;
16             b[i]=m*9;
17             cnt++;
18         }
19     }
20     while (scanf("%d",&n)==1){
21         int k=0;
22         for(int i=0;i<cnt;i++){
23             if(a[i]<n&&n<=b[i]){
24                 printf("C\n");
25                 k=1;
26                 break;
27             }
28         }
29         if(!k){printf("T\n");}
30     }
31     return  0;
32 }

 

 

以上是关于简单博弈的主要内容,如果未能解决你的问题,请参考以下文章

ACM模板——简单博弈

为啥这段代码会泄露? (简单的代码片段)

HDU 2516 取石子游戏(简单博弈)(斐波那契博弈)

最简单的博弈论——HDU - 5963 朋友 (博弈)

LeetCode 5024 除数博弈 --(简单博弈论)

通过脚本片段绕过XSS防御