题意
有
n
n
n堆石子,其中
n
n
n为偶数。两个人轮流操作,每次可以选择
n
2
\frac{n}{2}
2n堆石子,并在每堆石子中取走数量不为
0
0
0的石子(可以不相同),不能操作者输。问先手必胜还是后手必胜。
n
≤
50
,
每
堆
石
子
数
≤
50
n\le50,每堆石子数\le 50
n≤50,每堆石子数≤50
分析
这题不难但是挺有意思。
设
n
n
n堆石子中数量最少的石子数为
m
n
mn
mn
若石子数恰为
m
n
mn
mn的石子堆数大于
n
2
\frac{n}{2}
2n,则无论先手如何选择,
m
n
mn
mn的值必然会减小,设
m
n
mn
mn的值变为
m
n
′
mn'
mn′,则操作完后石子数为
m
n
′
mn'
mn′的堆数不大于
n
2
\frac{n}{2}
2n。
否则的话,先手可以通过对
n
2
\frac{n}{2}
2n堆石子数大于
m
n
mn
mn的石子堆操作,在不改变
m
n
mn
mn的情况下使得石子数恰为
m
n
mn
mn的石子堆数变为大于
n
2
\frac{n}{2}
2n。
若某一轮先手取完了某一堆石子,显然后手必胜。
故只要判断石子数为
m
n
mn
mn的堆数是否大于
n
2
\frac{n}{2}
2n即可。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
const int N=55;
const int inf=1e9;
int n,a[N];
int main()
{
scanf("%d",&n);
int mn=inf;
for (int i=1;i<=n;i++) scanf("%d",&a[i]),mn=std::min(mn,a[i]);
int cnt=0;
for (int i=1;i<=n;i++) if (a[i]==mn) cnt++;
if (cnt<=n/2) puts("Alice");
else puts("Bob");
return 0;
}