P r o b l e m \mathrm{Problem} Problem
题意简述:有 n n n 堆石子,第 i i i 堆石子有 a i a_i ai 个。
两人轮流取石子,每人一轮只能取一个石子,且不能取对手刚取过的那堆石子中的石子,无法取的一方失败,两方采取最优策略,问谁会获胜。
S o l u t i o n \mathrm{Solution} Solution
若存在 max a i > 0.5 ∑ a i \max_{a_i} > 0.5\sum a_i maxai>0.5∑ai,则先手必胜。我们考虑不存在上述情况的答案。
当 ∑ a i ≡ 0 ( m o d 2 ) \sum a_i≡0(\mathrm{mod\ 2}) ∑ai≡0(mod 2)时:
- 一定不会出现 max a i > 0.5 ∑ a i \max_{a_i} > 0.5\sum a_i maxai>0.5∑ai的情况,这可以通过后手调控。右边的数值会减一。左边若出现某一数值减一后不变,则必然会出现只存在于 n = 2 n=2 n=2 的情况,那么两个数都会减一,因此不存在左边不变的情况。所以上述条件恒成立。
- 后手操作后最后一定能变成里两堆。否则假设变成变成一堆后,先手必胜。
因此我们只要判断总和是奇数还是偶数即可。
C o d e \mathrm{Code} Code
#include <bits/stdc++.h>
using namespace std;
int read(void)
{
int s = 0, w = 0; char c = getchar();
while (!isdigit(c)) w |= c == '-', c = getchar();
while (isdigit(c)) s = s*10+c-48, c = getchar();
return w ? -s : s;
}
void work(void)
{
int n = read(), sum = 0, Max = 0;
for (int i=1;i<=n;++i) {
int x = read();
sum += x;
Max = max(Max, x);
}
if (Max <= sum / 2 && sum % 2 == 0) puts("B");
else puts("A");
return;
}
int main(void)
{
freopen("battle.in","r",stdin);
freopen("battle.out","w",stdout);
int T = read();
while (T --) work();
return 0;
}