Wannafly挑战赛24-A-石子游戏--【思维题】

链接: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 }
View Code

猜你喜欢

转载自www.cnblogs.com/zhazhaacmer/p/9670984.html