1051 石子游戏 博弈论-模拟

链接:https://ac.nowcoder.com/acm/contest/26656/1051
来源:牛客网

题目描述

Alice和Bob在玩游戏,他们面前有n堆石子,对于这些石子他们可以轮流进行一些操作,不能进行下去的人则输掉这局游戏。
可以进行两种操作:
1. 把石子数为奇数的一堆石子分为两堆正整数个石子
2. 把两堆石子数为偶数的石子合并为一堆
两人都足够聪明,会按照最优策略操作。现在Alice想知道自己先手,谁能最后赢得比赛。

输入描述:

第一行一个正整数n。(1<=n<=10
4
)
接下来第二行n个正整数表示每堆石子的数量。每堆石子不超过10
5
个。

输出描述:

Alice或者Bob,表示谁能最后赢得游戏。
示例1

输入

复制
3
3 2 2

输出

复制
Alice

说明

Alice只要现将两个石子数量为2的堆合并为一堆4个石子,Bob就只能把3分为两堆1和2,接下来Alice只要将2和4合并,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;
}

/*样例区


*/

//------------------------------------------------------------

 

posted @ 2022-07-30 22:48  er007  阅读(69)  评论(0编辑  收藏  举报