/*
*题号:1907
*State: 15MS 268K 572 B C++ *题目大意: * Nim博弈的变形,就是先取完者败。 *解题思路: * 如上题。 * //必输态 S0(考虑奇偶), T2 * //必胜态 S2, S1, T0
*/
View Code
 1 #include <iostream>
 2 using namespace std;
 3 int main(void)
 4 {
 5     int cas;
 6     scanf("%d", &cas);
 7     while(cas--)
 8     {
 9         int n;
10         scanf("%d", &n);
11         int tmp, sum = 0, fullPile = 0;
12         for(int i = 0; i < n; i++)
13         {
14             scanf("%d", &tmp);
15             if(tmp > 1)
16                 fullPile = 1;
17             sum ^= tmp;
18         }
19 
20         if(fullPile == 0)
21         {
22             if(sum != 0)
23             {
24                 if(n % 2)
25                     printf("Brother\n");
26                 else
27                     printf("John\n");
28             }
29             else
30                 printf("John\n");
31         }
32         else
33         {
34             if(sum == 0)
35                 printf("Brother\n");
36             else
37                 printf("John\n");
38         }
39     }
40     return 0;
41 }

 详细介绍该种算法:http://www.cnblogs.com/cchun/archive/2012/07/25/2609141.html

/*
*题号:2509
*State: 0MS 268K 510 B C++ *题目大意; * 给定n堆苹果,每次任意取一堆中的n个,最先取完者败 * 判断先手输赢。 *解题思路: * 利用Nim博弈中的变形来得到。 */
View Code
 1 #include <iostream>
 2 using namespace std;
 3 int main(void)
 4 {
 5     int n;
 6     while(scanf("%d", &n) == 1)
 7     {
 8         int tmp, sum = 0, fullPile = 0;
 9         for(int i = 0; i < n; i++)
10         {
11             scanf("%d", &tmp);
12             if(tmp > 1)
13                 fullPile = 1;
14             sum ^= tmp;
15         }
16 
17         //必输态 S0(考虑奇偶), T2
18         //必胜态 S2, S1, T0
19 
20         if(!fullPile)
21         {
22             if(sum != 0)
23             {
24                 if(n & 1)
25                     printf("No\n");
26                 else
27                     printf("Yes\n");
28             }
29             else
30                 printf("Yes\n");
31         }
32         else
33         {
34             if(sum == 0)
35                 printf("No\n");
36             else
37                 printf("Yes\n");
38         }
39     }
40     return 0;
41 }
posted on 2012-07-25 23:28  cchun  阅读(1112)  评论(0编辑  收藏  举报