Codeforces Round #832 (Div. 2) C. Swap Game (博弈论)
https://codeforces.com/contest/1747/problem/C
C. Swap Game
题目大意:
给定一个长度为n的数组a,每次只要当我想动但是发现a[1]==0的时候我就输了
要么就是我每次把a[1]的数值减一丢到后面的数组中去,同时从后面的数组中提出一个数字来放回到a[1]中。
alice先手,问我们谁能赢。
input
3
2
1 1
2
2 1
3
5 4 4
output
Bob
Alice
Alice
佬儿教学时间到了
可以证明必胜态是最小的元素(简称min)不是a[1],必败态是a[1] = min
首先考虑边界情况
a[1]=0的时候,0肯定是min,所以必败
然后比如0在后面,a[1]>0,那么可以把a[1]和这个0 交换,就必胜
然后一个人在必胜态时,只需把a[1]-- ,把min换到a1。这之后min还是最小的,跑到了a[1],就把必败态给对面了
同理,一个人在必败态,无论怎么操作,a[1]跑到后面还是最小的,就把必胜态给对面了
从边界情况往上推:
比如0在后面就必胜
然后推出 没有0的情况下 1在前面 就必败 等等
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=5000200,M=2002;
LL a[N];
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
cin>>T;
while(T--)
{
LL n;
cin>>n;
LL minn=1e9;
for(int i=1;i<=n;i++)
{
cin>>a[i];
minn=min(minn,a[i]);
}
if(a[1]==minn) cout<<"Bob"<<endl;
else cout<<"Alice"<<endl;
}
return 0;
}