码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ1299 [LLH邀请赛]巧克力棒

时间:2014-10-26 19:44:26      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   for   sp   

怎么又是博弈论。。。我去

Orz hzwer,这道题其实是可以转化成Nim游戏的!

"第一步:

先从n根巧克力棒中取出m(m>0)根,使得这m根巧克力棒的xor和为0,同时使得剩下的n-m根巧克力棒无论怎么取,xor和都不为0。

m根巧克力棒的xor和为0 <=>把nim游戏的必败状态留给对方

剩下的n-m根巧克力棒无论怎么取,xor和都不为0 <=>  m为巧克力棒的xor和为0的最长子序列

第二步:

第一步以后,对手就面临一个必败状态的nim游戏。

如果他从n-m根中取新的巧克力棒,实际上就是新建一个xor和不为0的nim游戏,这时轮到己方操作只要将这个新的nim游戏取到xor和为0即可。

也就是让对方再次面临所有nim游戏均为必败状态的局面。"

于是只要寻找m是否存在即可,由于n = 14,深搜即可。

 

bubuko.com,布布扣
 1 /**************************************************************
 2     Problem: 1299
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:8 ms
 7     Memory:804 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11  
12 using namespace std;
13 int n, a[20];
14 bool flag;
15  
16 inline int read(){
17     int x = 0, sgn = 1;
18     char ch = getchar();
19     while (ch < 0 || ch > 9){
20         if (ch == -) sgn = -1;
21         ch = getchar();
22     }
23     while (ch >= 0 && ch <= 9){
24         x = x * 10 + ch - 0;
25         ch = getchar();
26     }
27     return sgn * x;
28 }
29  
30 void dfs(int x, int cnt, int X){
31     if (x == n + 1){
32         if (!X && cnt) flag = 1;
33         return;
34     }
35     if (flag) return;
36     dfs(x + 1, cnt, X);
37     if (flag) return;
38     dfs(x + 1, cnt + 1, X ^ a[x]);
39 }
40  
41 int main(){
42     for (int t = 1; t <= 10; ++t){
43         flag = 0;
44         n = read();
45         for (int i = 1; i <= n; ++i)
46             a[i] = read();
47         dfs(1, 0, 0);
48         printf(flag ? "NO\n" : "YES\n");
49     }
50     return 0;
51 }
View Code

 

BZOJ1299 [LLH邀请赛]巧克力棒

标签:style   blog   http   color   io   os   ar   for   sp   

原文地址:http://www.cnblogs.com/rausen/p/4052548.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!