HDU 3951 (博弈) Coin Game

先考虑两种简单的情况:

  • 如果先手能一次把硬币拿完,即 k >= n ,那么先手胜
  • 如果每次只能拿一个硬币, 即 k = 1 ,那么如果有奇数个硬币先手胜,如果有偶数个硬币后手胜。

剩下的情况就是先手一次拿不完,而且每次可以拿一个或者拿两个硬币。

剩下的硬币会变成一条链,如果后手能拿完最好,不能拿完的话就拿一个或两个硬币使这条链变成长度相等的两条。

这一定是能做到的,

因为如果这条链有奇数个硬币,那么拿走中间的那个;

如果有偶数个硬币,拿走中间的两个。

变成相等的两条链之后,先手在哪条链拿走多少个硬币,后手就在另外一条链中拿走同样的硬币,直到拿完所有的硬币。

因此后手必胜。

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     //freopen("in.txt", "r", stdin);
 6 
 7     int T; scanf("%d", &T);
 8     for(int kase = 1; kase <= T; kase++)
 9     {
10         int n, k;
11         scanf("%d%d", &n, &k);
12         printf("Case %d: ", kase);
13         bool first;
14         if(k == 1) first = n & 1 ? true : false;
15         else if(k >= n) first = true;
16         else first = false;
17         printf("%s
", first ? "first" : "second");
18     }
19 
20     return 0;
21 }
代码君
原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4462937.html