首页 > 代码库 > 51nod1069(博弈)

51nod1069(博弈)

题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1069

 

题意: 中文题诶~

 

思路: 一开始我以为需要把上一堆到石子拿完才能拿下一堆,那样的话我们只需要先手每次拿一堆中一定数目的石子使剩下一颗石子就能保证他的优势,不过每次至少要拿一颗石头,所以当连续偶数堆的石头数目为1时,A和B会交换先手关系,所以我们只要判断连续偶数次1颗为一堆的石子的次数就可以得到最终答案~

事实证明我太天真了~虽然题目没说明,不过我看了后台数据(无奈~),A, B可以任意次序的拿走某堆中的石头...

这样如果再像刚才那样推的话情况太复杂了,无法解出题目...万般无奈之下看了题解(菜鸡总是有太多的无奈~)...

这里贴出一篇不错的题解: http://www.cnblogs.com/easonliu/p/4472541.html

感觉这种题目套路还是有的,可是具体题目还是基本全靠yy;

就像这道题, 如果做过类似的题目的话应该能比较容易判断出是np问题,不过p局面还是好难想到...

全部数据异或, 像这样毫无征兆的思路,因该全是yy的吧...

 

代码:

 1 #include <bits/stdc++.h>
 2 #define MAXN 1010
 3 using namespace std;
 4 
 5 int main(void){
 6     int n, flag, x;
 7     scanf("%d%d", &n, &flag);
 8     for(int i=1; i<n; i++){
 9         scanf("%d", &x);
10         flag^=x;
11     }
12     if(flag){
13         printf("A\n");
14     }else{
15         printf("B\n");
16     }
17     return 0;
18 }

 

51nod1069(博弈)