poj3480

【题意】

anti-nim游戏

【输入】

第一行一个t,表示t组数据

每组数据第一行一个n,表示n堆石子

接下来一行n个整数表示n堆石子的个数

【输出】

先手赢打"John",否则打"Brother"


anti-nim游戏

1)所有石子堆的数目都为1:
    显然,若有偶数堆石子堆,则必胜,否则必败。

2)如果恰好只有一堆石子数目大于1。
    我们可以把这堆石子取完或者取得只剩下1,使得只剩下奇数堆数目为1的石子留给对方,由1),必胜。

3)如果有至少2堆石子的数目大于1。
    考虑⊕值:
    若⊕值不为0,则按照NimGame走法取石。这样,当对手某次取完石子后,肯定会出现2)的情况,则必胜。

按照NimGame法则取完石子后,必定会给对手留下⊕值为0的局面。因此不可能给对手留下2)的局面(容易证明,2)局面的⊕值肯定不为0),而对手一次最多将一堆石子数大于1的石子堆处理掉。因此2)的情况肯定会出现。

相反,若⊕值为0,则无论如何走都会给对方留下2)或3)的情况,必败。


program poj3480;
var
  max,t,n,i,j,k:longint;
begin
  read(t);
  while t>0 do
    begin
      dec(t);
      read(n);
      max:=0;
      k:=0;
      for i:=1 to n do
        begin
          read(j);
          if j>max then max:=j;
          k:=k xor j;
        end;
      if ((k<>0)and(max>1))or((k=0)and(max<=1)) then writeln('John')
                                                else writeln('Brother');
    end;
end.


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值