1 . 巴士博弈

2017-08-05   22:48:00 

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

 

问题分析 :

  甲要想赢,从最后一步考虑,那他面对的石子必须是  <= m  的 , 又因为m是  >= 1 的 ,所以倒数第二步的石子如果是m+1 的话,无论乙玩家怎么拿,甲一定会最后一步拿干净,从而获得胜利 ,这也就是前面小结所说到的奇异局势。

  那么规律找到,就是在一个人面对 n = ( m + 1 ) * r ( r 为任意常数 ),当他取走 k 个时 ,另一方就取 ( m + 1 - k ) 个 , 从而形成 (m+1)* ( r - 1 ) ,一直按此规律取下去 ,此人必输 。另一种情况一个人在面对 n = ( m + 1 ) * r + s  ( r , s 为任意常数 ) , 若他上来先拿走 s 个 ,接下来无论对手拿走多少个 ,他都拿 ( m + 1 - k ) 个 , 他最后一定 获胜 。

   

  参考题目 :HDU-1846   http://acm.hdu.edu.cn/showproblem.php?pid=1846

  本题代码 :

    

#include <iostream>
using namespace std ;

int main ( ) {
    int c , n , m ;

    cin >> c ;
    while ( c-- ) {
        cin >> n >> m ;
        if ( n % ( m + 1 ) )
            cout << "first" << endl ;
        else cout << "second" << endl ;
    }

    return 0 ;
}

  

  

posted @ 2017-08-05 22:46  楼主好菜啊  阅读(2018)  评论(0编辑  收藏  举报