【初级博弈论】GYM 101808 problem I Ildar Yalalov

题目链接<http://codeforces.com/gym/101808/problem/I>


题意:

一共有n堆石子,两个人进行取石子游戏。每个人都可以进行两个操作:1、从任意一个石子堆里取一个石子。2、如果每个石子堆都是非空的,从每个石子堆里取一个石子。谁不能进行操作,谁就输。问最后的输赢情况。


题解:

假设没有第二个操作,每个人只能取走一个石子。那就是简单的奇偶判断,奇数个石子就是必胜态,偶数个石子就是必败态。能够改变奇偶性的也就是第二个操作,每个都取。这又分为机种情况。

1)如果n为奇数,那每个都取和只取一个是一样的,因为这对于奇偶性的改变是一样的。

      所以可以得出结论:sum偶,n为奇,是必败态。

                                       sum奇,n为奇,是必胜态。

2)如果n为偶数。这样是可能对奇偶性进行改变的。下面还要分两个情况进行一下推理:

      a.sum(石子总数)是偶数,n是偶数。

      这时候你只取一个石子是没用的,对面也可以只取一个石子,回到你手里的状况是没有改变的,一直这样下去也就是必输的。但如果你每个石子堆都取,因为总数是偶数,n也是偶数,偶数减去偶数还是偶数,所以相当于把这个状态转移给了另一个人。同样的,他也只能每个都取,然后再把这个状态再转移回来,一直往复。直到某一个石子堆没有了石子,那也就只有第一个操作(只取一个石子)可以进行了。这时候谁拿到这堆石子(此时石子总数也是偶数)就必输。而谁拿到石子,取决于中间一共进行了多少次第二个操作(每个都取),而这又取决于最小堆石子的数量。

      所以可以得出结论:sum偶,n为偶,x(最小堆的个数)为奇是必胜态。

                                       sum偶,n为偶,x为偶是必败态。

     b.sum是奇数,n是偶数。

      这个时候如果你每个都取是没有意义的。因为你可以凭借只取一个,使得sum变成偶数,n还是偶数,变成上一种情况。只要你能使得最小堆还保持偶数,给对方一个必败态也就赢了。所以如果你此时最小堆石子个数是奇数,就取最小堆的石子。如果最小堆石子个数是偶数,就不取最小堆,取一个比最小堆大的任意一堆就可以了。那如果没有比最小堆大的堆怎么办?换句话说全是最小堆呢?这种情况是不可能的,因为全是最小堆,也就是每个堆的个数都一样,但n是偶数,总数必然是偶数,就不符合这个情况了。

     所以可以得出结论:sum奇,n为偶,是必胜态。


#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<set>
#include<map>
#include<string>
#include<queue>
#include<stack>
#include<sstream>
#include<ctype.h>
#include<vector>
#include<list>
using namespace std;
typedef long long LL;
int t,n,x,sum,mi;
int main()
{
    scanf("%d",&t);
    while(t--){
        sum=0,mi=(int)1e9;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&x);
            sum+=x;
            mi=min(mi,x);
        }
        if(n%2){
            if(sum%2) printf("Yalalov\n");
            else printf("Shin\n");
        }
        else{
            if(sum%2){
                printf("Yalalov\n");
            }
            else{
                if(mi%2) printf("Yalalov\n");
                else printf("Shin\n");
            }
        }
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值