Codeforces Round #557 (Div. 2)E. Thanos Nim

Alice and Bob are playing a game with nn piles of stones. It is guaranteed that nn is an even number. The ii-th pile has aiai stones.

Alice and Bob will play a game alternating turns with Alice going first.

On a player's turn, they must choose exactly n2n2 nonempty piles and independently remove a positive number of stones from each of the chosen piles. They can remove a different number of stones from the piles in a single turn. The first player unable to make a move loses (when there are less than n2n2 nonempty piles).

Given the starting configuration, determine who will win the game.

Input

The first line contains one integer nn (2n502≤n≤50) — the number of piles. It is guaranteed that nn is an even number.

The second line contains nn integers a1,a2,,ana1,a2,…,an (1ai501≤ai≤50) — the number of stones in the piles.

Output

Print a single string "Alice" if Alice wins; otherwise, print "Bob" (without double quotes).

题目大概意思就是,有n堆石头,2个人每次可以取走n/2推石头中任意石头,大于0,当石头推小于n/2时,输

emmmmm,就是一道博弈题,这堆石头的最小值为x,x的推数为m,当m<=n/2时,Alice可以将剩下的大于m的数变为m,也就是说,Alice强迫Bob将m的值减小,而他最多减小n/2,下一轮Alice继续重复这个过程

直到m变为0,Alice获胜。代码如下

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
const double PI=3.1415926535897931;
const long long sale=1e9+10;
const int MA= 1e7+10;
const int ma= 2*1e5+10;
const int few=1e3+10;
using namespace std;
//////////////////////////////////////////////
int main()
{
    int n;
    cin>>n;
    int a[ma];
    int minn=INF;
    for(int i=0; i<n; i++)
    {
        cin>>a[i];
        minn=min(minn,a[i]);
    }
    int cnt=0;
    for(int i=0; i<n; i++)
    {
        if(minn==a[i])
            cnt++;
    }
    if(cnt<=n/2)
        cout<<"Alice"<<endl;
    else
        cout<<"Bob"<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/Aracne/p/12189516.html