取石子

http://codeforces.com/gym/101808/problem/I

题意:给出n堆石子,两种拿取方法:

1、从一堆中取出一个

2、从所有堆中取出一个(条件每一堆至少一个)

分类讨论:

1、当sum 为奇数,且有奇数组,不管如何取都不会改变双方面对sum的奇偶性,所以先手胜。

2、当sum为奇数,且有偶数组,先手可以(根据第4种情况,如果最小值为奇数就取1个,否则取n个)控制操作2使得最终为奇数。

3、当sum为偶数,且有奇数组,同一,先手输。

4、当sum为偶数,且有偶数组,最小值为奇数,则先手胜,最小值为偶数,先手输。

 

#include <iostream>
#include <iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;

int a[109] ;

int main()
{
    int n ;
    scanf("%d" , &n);
    while(n--)
    {
        int m , x; 
        cin >> m ;
        int sum = 0 ;
        for(int i = 0 ; i < m ; i++)
        {
            cin >> a[i];
            sum += a[i];
        }
        sort(a , a + m);
        x = a[0] ;
        if(m % 2 == 1)
        {
            if(sum % 2 == 1)
                cout << "Yalalov" << endl ;
            else
                cout << "Shin" << endl ;
        }
        else
        {
            if(sum % 2 == 1)
                cout << "Yalalov" << endl ;
            else
            {
                if(x % 2 == 1)
                    cout << "Yalalov" << endl;
                else
                    cout << "Shin" << endl;
                    
            }
        }
    }


    return 0;
}

 

 

 

 

posted @ 2019-07-23 21:32  无名菜鸟1  阅读(202)  评论(0编辑  收藏  举报