题目描述:
思想:
当数列中最小值为0时:
1. 若a1 = 0,则先手必败。
2. 若a1 != 0, 则先手必胜。
当数列中最小值为1时:
- 若a1=1,则先手必败,因为先手必然要把a1减至0然后换走,然后后手只需把这个0再换回到a1位置即可.
- 若a1≠1,先手必胜,因为先手可以把1换到a1位置,然后就变成了情况
进一步推论,假设数组的最小值为 x , 当 a1 = x 时,先手必败,a1 != x 时先手必胜。
证明如下:
假设如果数列最小值为x时结论成立,即a1=x时先手必败,a1≠x先手必胜,接下来我们要证明数列最小值为x+1时结论也成立.
- 若a1=x+1,则先手必败,因为先手操作后a1=x,无论换到哪个位置后手只要换回去a1位置就会变成数列中最小值为x时a1=x的情况,还是必败的.
- 若a1≠x+1,先手必胜,因为先手可以把x+1换到a1位置,然后就变成了情况1,后继状态是必败态.
根据数学归纳法,结论成立.所以只需要判断a1是不是数列最小值即可.
AC代码:
const int maxn = 1e5 + 5;
int a[maxn];
int main(){
int T;
cin >> T;
while(T--){
int n;
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
cout << (a[1] == *min_element(a + 1, a + n + 1) ? "Bob" : "Alice") << '\n';
}
}