取石子
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; }