51nod1069(nim博弈)

题目链接: 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 }

 

转载于:https://www.cnblogs.com/geloutingyu/p/6193081.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值