ac数论之博弈论之巴什博弈

情形一:最后取光者胜

玩过巴什博弈类型之一的取石子的人都知道给你n个石子,两个人轮流取,规定每人每次至少取一个最多取m个,那么第一种情况是说最后取光者胜,并且假设双方都采用最优策略。

分析,如果留给对手最后是m+1个那么对手至多取m个,最少取1个,那么最后取玩的一定是自己,那么如果在每次取之前对手都面对着(m+1)的倍数,即对手无论接下来取多少,自己总能补齐使两个人的取的石子数目只和为(m+1)最后对手就会面临m+1个石子的情况即自己一定会最后拿完

即如果自己是先手,那么如果n%(m+1)==0即自己面临(m+1)倍数的情形,并在双方均采用最佳策略的情况下一定会输

如果n%(m+1)!=0那么自己就取走n%(m+1)个,使对手面临(m+1)的倍数,即最后对手一定会输

情形二:最后取光者败

如果最后你的对手取的时候只剩下一个石子,由于至少取一个,那么你的对手一定是取光的,那么即对手一定输,即n-1个石子谁先取完谁就赢了,那么参照情形一如果自己先手,并且(n-1)%(m+1)==0,那么自己一定会输否则对手一定输

特殊情形:

如果m>=n

就是说可以一次取走,对于情形一来说先手一定赢,,如果此时n=1那么对于情形二来说先手必输,否则后手必输。

传送门

Stone

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2144    Accepted Submission(s): 1511


Problem Description
Tang and Jiang are good friends. To decide whose treat it is for dinner, they are playing a game. Specifically, Tang and Jiang will alternatively write numbers (integers) on a white board. Tang writes first, then Jiang, then again Tang, etc... Moreover, assuming that the number written in the previous round is X, the next person who plays should write a number Y such that 1 <= Y - X <= k. The person who writes a number no smaller than N first will lose the game. Note that in the first round, Tang can write a number only within range [1, k] (both inclusive). You can assume that Tang and Jiang will always be playing optimally, as they are both very smart students.
 

Input
There are multiple test cases. For each test case, there will be one line of input having two integers N (0 < N <= 10^8) and k (0 < k <= 100). Input terminates when both N and k are zero.
 

Output
For each case, print the winner's name in a single line.
 

Sample Input
 
  
1 130 310 20 0
 

Sample Output
 
  
JiangTangJiang
 

#include<iostream>
using namespace std;
int main()
{
    int n,m;
    while(cin>>n>>m&&n>0)

    {
        if((n-1)%(m+1)!=0)
            cout<<"Tang"<<endl;
        else
            cout<<"Jiang"<<endl;
    }
}

Public Sale

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10000    Accepted Submission(s): 5957


Problem Description
虽然不想,但是现实总归是现实,Lele始终没有逃过退学的命运,因为他没有拿到奖学金。现在等待他的,就是像FarmJohn一样的农田生涯。

要种田得有田才行,Lele听说街上正在举行一场别开生面的拍卖会,拍卖的物品正好就是一块20亩的田地。于是,Lele带上他的全部积蓄,冲往拍卖会。

后来发现,整个拍卖会只有Lele和他的死对头Yueyue。

通过打听,Lele知道这场拍卖的规则是这样的:刚开始底价为0,两个人轮流开始加价,不过每次加价的幅度要在1~N之间,当价格大于或等于田地的成本价 M 时,主办方就把这块田地卖给这次叫价的人。

Lele和Yueyue虽然考试不行,但是对拍卖却十分精通,而且他们两个人都十分想得到这块田地。所以他们每次都是选对自己最有利的方式进行加价。

由于Lele字典序比Yueyue靠前,所以每次都是由Lele先开始加价,请问,第一次加价的时候,
Lele要出多少才能保证自己买得到这块地呢?
 

Input
本题目包含多组测试,请处理到文件结束(EOF)。每组测试占一行。
每组测试包含两个整数M和N(含义见题目描述,0<N,M<1100)
 

Output
对于每组数据,在一行里按递增的顺序输出Lele第一次可以加的价。两个数据之间用空格隔开。
如果Lele在第一次无论如何出价都无法买到这块土地,就输出"none"。
 

Sample Input
 
  
4 23 23 5
 

Sample Output
 
  
1none3 4 5

#include<iostream>
using namespace std;
int r[10000];
int ri=0;
int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        ri=0;
        if(n%(m+1)!=0)
        {
            for(int i=1;i<=m;i++)
            {
                if((n-i)%(m+1)==0||n-i<=0)
                    r[ri++]=i;
            }
            for(int i=0;i<ri-1;i++)
                cout<<r[i]<<" ";
            cout<<r[ri-1];
            cout<<endl;
        }
        else
            cout<<"none"<<endl;
    }
}

Good Luck in CET-4 Everybody!

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 12163    Accepted Submission(s): 7882


Problem Description
大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧张得连短学期的ACM都没工夫练习了,反正我知道的Kiki和Cici都是如此。当然,作为在考场浸润了十几载的当代大学生,Kiki和Cici更懂得考前的放松,所谓“张弛有道”就是这个意思。这不,Kiki和Cici在每天晚上休息之前都要玩一会儿扑克牌以放松神经。
“升级”?“双扣”?“红五”?还是“斗地主”?
当然都不是!那多俗啊~
作为计算机学院的学生,Kiki和Cici打牌的时候可没忘记专业,她们打牌的规则是这样的:
1、  总共n张牌;
2、  双方轮流抓牌;
3、  每人每次抓牌的个数只能是2的幂次(即:1,2,4,8,16…)
4、  抓完牌,胜负结果也出来了:最后抓完牌的人为胜者;
假设Kiki和Cici都是足够聪明(其实不用假设,哪有不聪明的学生~),并且每次都是Kiki先抓牌,请问谁能赢呢?
当然,打牌无论谁赢都问题不大,重要的是马上到来的CET-4能有好的状态。

Good luck in CET-4 everybody!
 

Input
输入数据包含多个测试用例,每个测试用例占一行,包含一个整数n(1<=n<=1000)。
 

Output
如果Kiki能赢的话,请输出“Kiki”,否则请输出“Cici”,每个实例的输出占一行。
 

Sample Input
 
  
13
 

Sample Output
 
  
KikiCici

#include<iostream>
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        if(n%3==0)
            cout<<"Cici"<<endl;
        else
            cout<<"Kiki"<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/memeda1141/article/details/80070782