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 ; }
东北日出西边雨 道是无情却有情