codeforces 博弈 Swap Game

题目描述:

 

思想:

        

当数列中最小值为0时:

    1. 若a1 = 0,则先手必败。

    2. 若a1 != 0, 则先手必胜。

当数列中最小值为1时:

  1. 若a1=1,则先手必败,因为先手必然要把a1减至0然后换走,然后后手只需把这个0再换回到a1位置即可.
  2. 若a1≠1,先手必胜,因为先手可以把1换到a1位置,然后就变成了情况

进一步推论,假设数组的最小值为 x , 当 a1 = x 时,先手必败,a1 != x 时先手必胜。

证明如下: 

假设如果数列最小值为x时结论成立,即a1=x时先手必败,a1≠x先手必胜,接下来我们要证明数列最小值为x+1时结论也成立.

  1. 若a1=x+1,则先手必败,因为先手操作后a1=x,无论换到哪个位置后手只要换回去a1位置就会变成数列中最小值为x时a1=x的情况,还是必败的.
  2. 若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';
    }

}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值