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;
}
posted @ 2022-11-05 15:51  Vijurria  阅读(111)  评论(0编辑  收藏  举报