zoukankan      html  css  js  c++  java
  • [笔记] 巴什博弈

    [笔记] 巴什博弈

    Define

    巴什博弈是最简单的一种博弈,定义如下

    只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。

    必胜态(N)和必败态(P)

    • 所有必胜态(N)肯定有一种方法转移到必败态(P)
    • 必败态(P)无论怎么转移,都会转移到必胜态(N)(下一手必胜)
    • 所有终结点是必败态(P)

    分析必胜态(N)和必败态(P)都是以终结点开始进行逆序分析

    Analyze

    对于必胜态(N)和必败态(P)的分析

    现在如果一共有(m+1)个物品,我们去取它,先手至少要取一个,却又把所有的物品取不完,这样就导致了后手的必赢

    如果物品数小于等于能取的数目,是必胜的,因为只用取一次,如果是大于能取的数目的,我们可以把总数(n)分解为((m+1)∗x+r)

    显然对于((m+1)∗x+r)个数,如果我们先手,只需要取走(r)个数,然后留((m+1)∗x)给对方,这样一来,每次对方取一个数(y)我们就只需要取(m+1−y)个就可以了,也就是说每一个(m+1)的最后一个都是最开始的先手取的,这样就能保证如果是可以分解为((m+1)∗x+r)的话,先手必胜,如果只能分解为((m+1)∗x)的话,先手必败

    Code

    [HDU2846] Brave Game

    #include <iostream>
    #include <cstdio>
    #define sc(x) scanf("%d", &x);
    
    using namespace std;
    
    int main(){
    	int t, n, m;
    	sc(t);
    	while(t--){
    		sc(n);
    		sc(m);
    		if(n % (m + 1) == 0)
    			printf("second
    ");
    		else 
    			printf("first
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    Oracle学习笔记(oracle日期处理)
    Oralce学习笔记(plsql链接客户端)
    innerText和innerHTML应用
    oracle学习笔记(行转列列转行)
    js工作笔记基础一(分隔字符串)
    Oracle学习笔记(动态函数调用)
    理解!Page.IsPostBack和NET控件中的AutoPostBack
    oracle学习笔记(包头模板)
    div拖动层自己写
    oralce学习笔记(包体模板)
  • 原文地址:https://www.cnblogs.com/LMSH7/p/9569813.html
Copyright © 2011-2022 走看看