Alice 和 Bob 正在玩一个关于石头的游戏。
共有 n (n 为偶数)堆石子,其中第 i 堆最初含有 ai 个石子。
他们轮流选择 n/2 堆非空石子,每堆移除掉正数个(可以不同)的石子,从 Alice 开始。
不能执行操作的人将输掉游戏。
假设 Alice 和 Bob 都足够聪明,你知道谁会赢得游戏吗?
输入格式
第一行包含一个整数 n (2≤n≤106),n 为偶数
第二行包含 n 个正整数 a1,…,an (1≤a1,…,an≤109)
输出格式Alice 或 Bob,表示最终赢家
样例输入4 1 1 1 1样例输出
Bob思路
显然第一个制造空堆的人会输 => 当1的个数>=1&&<=n/2时当前未操作者获胜 => 谁先制造1谁会输 => 谁先制造2谁会输 => … => 谁先制造出当前最小值谁输。当最小值个数cnt<=n>>1时,Alice可以翻身一转攻势,转变为Bob会制造出最小值。
#includetypedef long double ld; typedef long long ll; #define pb push_back #define mk make_pair #define mt make_tuple #define eb emplace_back #define pob pop_back #define rz resize #define mem(a,b) memset(a,b,sizeof(a)) #define all(a) (a).begin(),(a).end() #define rall(a) (a).rbegin(),(a).rend() #define debug(a) cout<<#a<<"="<=b;i--) inline ll rr(){ll f=1,x=0;char ch;do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');return f*x;} using namespace std; const ll INF=0x3f3f3f3f,inf=0x3f3f3f3f3f3f3f; const ll mod[2]={int(1e9 + 7), 10007}; const int base[2]={29,31}; const int maxn=2e3+6; ll qpow(ll x,ll n){ll ans=1;while(n>0){if(n&1)ans=ans*x%mod[1];x=x*x%mod[1];n>>=1;}return ans;} int n; int main(int argc, char const *argv[]) { std::vector a; n=rr(); int x; for(int i=0;i if(a[i]==minx) cnt++; if(a[i]==1) cnt_1++; } if(cnt_1 && cnt_1<=n>>1) {std::cout << "Alice" << 'n';return 0;} else if(cnt_1) {std::cout << "Bob" << 'n';return 0;} if(cnt<=n>>1) {std::cout << "Alice" << 'n';return 0;} else std::cout << "Bob" << 'n'; return 0; }



