标签:can close clu name ems wan 一个 石子合并 spl
链接:https://www.nowcoder.com/acm/contest/186/A 来源:牛客网 石子游戏 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 Alice和Bob在玩游戏,他们面前有n堆石子,对于这些石子他们可以轮流进行一些操作,不能进行下去的人则输掉这局游戏。 可以进行两种操作: 1. 把石子数为奇数的一堆石子分为两堆正整数个石子 2. 把两堆石子数为偶数的石子合并为一堆 两人都足够聪明,会按照最优策略操作。现在Alice想知道自己先手,谁能最后赢得比赛。 输入描述: 第一行一个正整数n。(1<=n<=104) 接下来第二行n个正整数表示每堆石子的数量。每堆石子不超过105个。 输出描述: Alice或者Bob,表示谁能最后赢得游戏。 示例1 输入 复制 3 3 2 2 输出 复制 Alice 说明 Alice只要现将两个石子数量为2的堆合并为一堆4个石子,Bob就只能把3分为两堆1和2,接下来Alice只要将2和4合并,Bob输掉了这局游戏。
思路:
Alice和Bob在玩游戏,他们面前有n堆石子,对于这些石子他们可以轮流进行一些操作,不能进行下去的人则输掉这局游戏。
可以进行两种操作:
1. 把石子数为奇数的一堆石子分为两堆正整数个石子
2. 把两堆石子数为偶数的石子合并为一堆
两人都足够聪明,会按照最优策略操作。现在Alice想知道自己先手,谁能最后赢得比赛。
1、全部为1时,后手必胜,因为先手根本没有办法可走!同样1也是可以忽略掉的,根据上面的规则可知1也是可以忽略掉的。
2、剔除1后,举例:5可以拆分成2和3(一步),同样也可以拆成1和4(一步)——然后1和4一直变化总共到不能变化为止是三步,先手面对5时肯定是先手必胜局!
3、本题数据可能不是很严谨,看了一些题解发现了一些问题!例如“4 4 4 4”是先手必胜局,“4 4 4”是先手必败局!
4、我的想法是统计大于1的奇数的个数,没发现一次从cnt1++,cnt2++;然后是发现一个偶数cnt2++;若((cnt1+cnt2-1)%2==1 )先手必胜,反之必败。
1 #include <iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<algorithm> 5 #include<math.h> 6 #include<string> 7 #include<map> 8 #include<time.h> 9 #include<vector> 10 #define ull unsigned long long 11 using namespace std; 12 #define inf 0x3f3f3f3f 13 #define ll long long 14 #define mem(a,b) memset(a,b,sizeof(a)) 15 const int N=107; 16 int a[20005]; 17 18 int main(){ 19 int n; 20 21 while(scanf("%d",&n)!=EOF){ 22 23 int x,cnt1=0,cnt2=0; 24 for(int i=0;i<n;i++){ 25 scanf("%d",&x); 26 if(x%2==0) 27 cnt2++; 28 else if(x>1&&x%2!=0) 29 cnt1++,cnt2++; 30 } 31 32 if((cnt1+cnt2-1)%2==1 ) 33 printf("Alice\n"); 34 else 35 printf("Bob\n"); 36 } 37 38 return 0; 39 }
标签:can close clu name ems wan 一个 石子合并 spl
原文地址:https://www.cnblogs.com/zhazhaacmer/p/9670984.html