1051 石子游戏 博弈论-模拟
链接:https://ac.nowcoder.com/acm/contest/26656/1051
来源:牛客网
题目描述
Alice和Bob在玩游戏,他们面前有n堆石子,对于这些石子他们可以轮流进行一些操作,不能进行下去的人则输掉这局游戏。
可以进行两种操作:
1. 把石子数为奇数的一堆石子分为两堆正整数个石子
2. 把两堆石子数为偶数的石子合并为一堆
两人都足够聪明,会按照最优策略操作。现在Alice想知道自己先手,谁能最后赢得比赛。
可以进行两种操作:
1. 把石子数为奇数的一堆石子分为两堆正整数个石子
2. 把两堆石子数为偶数的石子合并为一堆
两人都足够聪明,会按照最优策略操作。现在Alice想知道自己先手,谁能最后赢得比赛。
输入描述:
第一行一个正整数n。(1<=n<=104
)5
接下来第二行n个正整数表示每堆石子的数量。每堆石子不超过10
个。
输出描述:
Alice或者Bob,表示谁能最后赢得游戏。
分析
//-------------------------代码---------------------------- //#define int ll const int N = 1e5+10; int n,m; void solve() { cin>>n; int d1 = 0,ji = 0,ou = 0; fo(i,1,n) { int x;cin>>x; if(x == 1) d1 ++ ; else { if(x & 1) ji ++ ; else ou ++ ; } } int sum = 0; sum += ji; ou += ji; while( ou >= 2) { sum += ou / 2; if(ou & 1) { ou = ou / 2 + 1; } else { ou = ou / 2; } } if(sum & 1 ) { cout<<"Alice" ; } else { cout<<"Bob"; } } signed main(){ clapping();TLE; // int t;cin>>t;while(t -- ) solve(); // {solve(); } return 0; } /*样例区 */ //------------------------------------------------------------