HDU 3951 Coin Game (博弈)

又是一道博大精深的博弈题目。

已经说了 巴什博弈威佐夫博弈尼姆博弈SG函数找规律的博弈,这次和找规律有点类似——对称博弈。

一般都是圆啊方啊什么的。

对于这道题而言,可以有三种情况:

①k等于1    一次最多只能拿1个(每堆只有一个),那就是看奇偶了。

②n≤k  这种情况,那肯定先拿的赢。

③ 这条就是对称博弈了, 除了上述两种情况外的情况(n>k && k!=1)

这时候,无论你第一个人拿什么,怎么拿,后手的人完全可以在第一个人拿的对称的地方做同样的事情。

这样,后手就一定会取得胜利,因为最后一步是后手走的。

第三条自己在本上画一画就不难发现了。

恩,博弈论,暂时就先到这里了。。。。

#include<stdio.h>
int main()
{
    int t,i,n,k;
    scanf("%d",&t);
    for(i=1;i<=t;i++){
        scanf("%d%d",&n,&k);
        printf("Case %d: ",i);
        if(k==1){
            if(n&1) printf("first\n");
            else printf("second\n");
        }
        else if(n<=k) printf("first\n");
        else printf("second\n");
    }
    return 0;
}
时间: 2024-10-29 19:10:12

HDU 3951 Coin Game (博弈)的相关文章

HDU 3537 Daizhenyang&#39;s Coin(博弈-sg)

Daizhenyang's Coin Problem Description We know that Daizhenyang is chasing a girlfriend. As we all know, whenever you chase a beautiful girl, there'll always be an opponent, or a rival. In order to take one step ahead in this chasing process, Daizhen

HDU 2147-kiki&#39;s game(博弈/找规律)

kiki's game Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 40000/10000 K (Java/Others) Total Submission(s): 9174    Accepted Submission(s): 5485 Problem Description Recently kiki has nothing to do. While she is bored, an idea appears in his

hdu 2188 巴什博弈

巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规 定每次至少取一个,最多取m个.最后取光者得胜. 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个, 后取者都能够一次拿走剩余的物品,后者取胜.因此我们发现了如何取胜的法则:如果 n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走 k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的 取法,那么先取者肯定获胜.总

HDU 2069 Coin Change 母函数求解

HDU 2069 Coin Change 母函数求解 题目:http://acm.hdu.edu.cn/showproblem.php?pid=2069 这题比普通的母函数求解题目复杂一点,多了组成个数的限制, 要求组合个数不能超过 100 个硬币,所以将 c1, c2 定义为二维数组, c1[i][j] 表示 c1[结果][组成该结果的个数] ,然后多了一层遍历个数的循环. // 母函数求解 #include <bits/stdc++.h> using namespace std; cons

UVa 674 &amp; hdu 2069 Coin Change (母函数,dp)

链接:uva 674 题意:有5中货币,价值分别为 50-cent, 25-cent, 10-cent, 5-cent,1-cent,数量都为无限个, 给定一个数 n,求用上述货币组成价值为 n 的方法有多少? 分析:因为n<=7489,可以用 母函数 或 dp 打表 对于dp状态方程为: dp[j]+=dp[j-c[i]] 母函数: #include<stdio.h> int c1[7500],c2[7500],w[5]={1,5,10,25,50};; void mhs() { in

hdu 5165 Funny Game (博弈)

hdu 5165 Funny Game (博弈) 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5165 题意: Bob有一个数组{a1,a2,...,an},数组中的每个元素都是介于1到n之间的整数.Bob还有m个函数,他们的定义域和值域都是集合{1,2,...,n}.Bob和Alice轮流开始玩游戏,Alice先开始.对于每一轮,玩家可以选择一个函数f使得数组中每个元素 ai(1 <= i <= n)变成f(ai).例如,一开始数组是{1,

HDU 3544 (不平等博弈) Alice&#39;s Game

切巧克力的游戏,想得还是不是太明白. 后者会尽量选前着切后其中小的一块来切,那么先手须尽量取中间来切. So?题解都是这么一句话,不知道是真懂了还是从别人那抄过来的. 后来找到一个官方题解,分析得比较认真,但我这智商还是没懂太多,QAQ 本题我抄袭自<Winning Ways for your Mathematical Plays> ,一本关于游戏论的科普类图书.这题是一个组合游戏,但是并不是一个对等的组合游戏,所以试图使用 SG 函数相关知识解答是会面临巨大的挑战的. 书中本题的做法描述得十

HDU 3951 (博弈) Coin Game

先考虑两种简单的情况: 如果先手能一次把硬币拿完,即 k >= n ,那么先手胜 如果每次只能拿一个硬币, 即 k = 1 ,那么如果有奇数个硬币先手胜,如果有偶数个硬币后手胜. 剩下的情况就是先手一次拿不完,而且每次可以拿一个或者拿两个硬币. 剩下的硬币会变成一条链,如果后手能拿完最好,不能拿完的话就拿一个或两个硬币使这条链变成长度相等的两条. 这一定是能做到的, 因为如果这条链有奇数个硬币,那么拿走中间的那个: 如果有偶数个硬币,拿走中间的两个. 变成相等的两条链之后,先手在哪条链拿走多少个

hdu 3951(博弈规律)

题意:给定围成一个圈的硬币n枚,然后每次可以取出连续的1-k枚,谁取完最后一枚谁就获胜. 分析:对于第二个人当第一个人取完后,他可以取成对称的形式,所以第二个人必胜. 代码: #include<stdio.h> #include<string.h> #include<math.h> int main() { int i,n,k,T; scanf("%d",&T); for(i=1;i<=T;i++) { scanf("%d%d