题解:CF2002B Removals Game

· · 题解

简要说明题意:

有两个 \{1,2,\dots,n\} 的序列,两人轮流删除各自序列头或尾的一个数,两人序列均剩一个数时,若两数相同则第二个人获胜,否则第一个人获胜。给出序列,求两人均最优操作时的胜者。

题目分析

题解提到只要字符串不相同且不是互为逆序,Alice 必然获胜。下面进行简单的分析:

假设最后剩下的 3 个数不相同,则 Alice 必然获胜。

假设存在序列 a,b,ca,c,b,则 Alice 只要先对 Bob 不可删除的 c 动刀,再对 Bob 选择的数动刀,Bob必然不可能保证两数相同。

此外,对于存在不同且长度超过 2 的序列(如 a,b,c,da,b,d,c),Alice 只要尽可能删成前两种情况(如无脑删到只剩 a,b,c,为了最优 Bob 只能跟着删你删的)。

是个有一定思维难度的题目。

但是代码说不上复杂:

#include<cstdio>
#include<algorithm>
using namespace std;
int a[300001],b[300001];
bool cnta[300001],cntb[300001];
int main(){
    int T,n,ai,aj,bi,bj;
    bool mark0,mark1;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        for(int i=0;i<n;++i) scanf("%d",a+i);
        for(int i=0;i<n;++i) scanf("%d",b+i);
        mark0=true,mark1=true;
        for(int i=0;i<n;++i){
            if(a[i]^b[i]) mark0=false;
            if(a[i]^b[n-i-1]) mark1=false;
        }
        printf(mark0||mark1?"Bob\n":"Alice\n");
    }
    return 0;
}