Bash 游戏 

有一堆石子共有N个。A B两个人轮流拿,A先拿。每次最少拿1颗,最多拿K颗,拿到最后1颗石子的人获胜。

假设A B都非常聪明,拿石子的过程中不会出现失误。给出N和K,问最后谁能赢得比赛。

 

基础:1      ,      2, ...,        m是必赢局面,   m+1是必输局面
递推:m+2,m+3, ... ,2m+1是必赢局面,2m+2是必输局面 
             ...

            k(m+1)是必输局面,应该允许k=0,因为0显然也是必输局面    

在必输局和必赢局中,赢的一方的策略是: 拿掉部分物品,使对方面临k(m+1)的局面 

例如上例中10个物品,只能拿1到5个,先手方拿4个即可,对手无论拿多少个,你下次总能拿完

从另一个角度思考这个问题,如果物品数量随机,那么先手一方胜利的概率是m/(m+1),后手方胜利的概率是1/(m+1)

 

 1 #include <ctype.h>
 2 #include <cstdio>
 3 
 4 int n,x,y;
 5 
 6 inline void read(int&x) {
 7     register char c=getchar();
 8     for(x=0;!isdigit(c);c=getchar());
 9     for(;isdigit(c);x=x*10+c-48,c=getchar());
10 }
11 
12 int hh() {
13     read(n);
14     while(n--) {
15         read(x);read(y);
16         if(x%(y+1)==0) printf("B\n");
17         else printf("A\n"); 
18     }
19     return 0;
20 } 
21 
22 int sb=hh();
23 int main() {;}
Bash

相关文章: