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 }

原文地址:https://www.cnblogs.com/zhazhaacmer/p/9670984.html

时间: 2024-10-11 18:42:39

Wannafly挑战赛24-A-石子游戏--【思维题】的相关文章

Wannafly挑战赛24

A. 石子游戏 Alice和Bob在玩游戏,他们面前有n堆石子,对于这些石子他们可以轮流进行一些操作,不能进行下去的人则输掉这局游戏.可以进行两种操作:1. 把石子数为奇数的一堆石子分为两堆正整数个石子2. 把两堆石子数为偶数的石子合并为一堆两人都足够聪明,会按照最优策略操作.现在Alice想知道自己先手,谁能最后赢得比赛. 特判全1的状态, 忽略掉所有的1, 若奇数个数+总个数为偶数则先手必胜否则后手必胜. 因为每一步无论如何操作奇数个数+总个数的奇偶性一定改变. B. 222333 小Y最近

bzoj千题计划310:bzoj5285: [Hnoi2018]寻宝游戏(思维题+哈希)

https://www.lydsy.com/JudgeOnline/problem.php?id=5285 |0 和 &1 没有影响 若填‘|’,记为0,若填‘&’,记为1 先只考虑最后一位 若要求最后=1 那么最后一个|1 要在最后一个 &0 后面 将n个数的最后一位拿出来构成一个01序列 填在所有数最后一位之前的运算符也拿出来构成一个01序列 将第n个数所在位置视为最高位 对于最高位来说 如果数字序列 和 运算符序列 都是0或都是1,没有影响 如果数字序列是0,运算符序列是1,

Wannafly挑战赛2D Delete (最短路好题)

大意: 给定DAG, 给定点$S,T$, 每次询问给出点$x$, 求删除$x$后的$S->T$的最短路, 询问之间独立. 删除点$x$的最短路一定要经过一条边$(u,v)$, 满足$u$拓扑序在$x$前, $v$拓扑序在$x$后. (对于拓扑序相同的点不会有影响) 这样可以枚举每一条边, 用线段树维护删除每个点的答案. #include <iostream> #include <sstream> #include <algorithm> #include <

[GDOI2017] 取石子游戏(LCA)

[GDOI2017] 取石子游戏(LCA) 题面 给出一棵树,每个点都有一个权值.对于每个节点,求去掉该节点的子树后,剩下所有节点的权值MEX(最小的没有出现的非负整数.) 分析 用权值线段树合并乱搞显然是可行的,但细节很多且需要卡常. 我们考虑所有权值为\(i\)的节点对答案的影响.求所有节点的LCA,那么对于从LCA向上到根的路径上的节点,去掉子树后的部分中一定没有值\(i\).那么值\(i\)就可能成为它们的MEX. 因此按权值从小到大,每次求出权值为\(i\)的节点的LCA,然后暴力往上

hdu 1527 取石子游戏(威佐夫博奕模板题)

取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3562    Accepted Submission(s): 1789 Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的

hdu 2177 取(2堆)石子游戏 博弈论,,威佐夫博奕 ,提高题,不过测试数据奇水无比

取(2堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1291    Accepted Submission(s): 764 Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相

hdu1527 &amp; poj1067 取石子游戏 威佐夫博奕模型,,模板题o(╯□╰)o

取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35727   Accepted: 12065 Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者.现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者

hdu 2516 取石子游戏 Fibonacci博弈 入门题

取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3069    Accepted Submission(s): 1784 Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出"Second win&q

poj1067-取石子游戏 (威佐夫博弈) 【博弈】

http://poj.org/problem?id=1067 取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 36753   Accepted: 12446 Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者.现在给出初始的两堆石子的数目,如