Poi 的消消乐

题目链接:https://ac.nowcoder.com/acm/contest/109080/D

题意:

给定一个染色序列,每次可选择4个数i,j,k,l 满足0<=i<=j<k<=j<n(k=j+1),使得染色数组值c[ixj]=c[kxl]相同,并且选择一个从数组中消去

思路:

这辈子和分类讨论,贪心构造这些神秘题过不去了

明明感觉不难,但就是做不出来

首先如果只有一种染色种类,那么很显然答案为1

观察到位置0和位置1是特殊的

如果有一个染色块A在位置0,显然取i=j=0,k=1,l=?(l取和它颜色相同的块的位置)

这非常轻松地把这一类染色块消除到了一块

由于是任选两者其一消去,那么我们最后可以选择把第一块消去,保留最后一块,看能不能给另一种染色块B腾出位置0来

如果可以,那么另一种也能消除到只剩一块

反之,就是ABBBBBBB这种情况(这也是我赛时讨论错了的)

我们此时需要取i=j=1,k=2,l=?

由于l>=k,所以l最小为2,则lxk最小等于4

也就是说位置1,2,3的B消除不了

则A留1个,B最多留3个

综上答案可能为1,2,3,4

void solve(){
    int n;cin>>n;
    string s;cin>>s;
    int f=0;
    int a=0,b=0;
    int temp=s[0];
    for(int i=0;i<n;i++){
        if(s[i]==s[0])a++;
        else{
            b++;
        }
    }
    if(s[0]==s[1])f=1;
    if(b==0){
        cout<<1<<endl;return;
    }

    if(!f){
        if(a>1){
            cout<<2<<endl;return;
        }else{
            cout<<2<<endl;return;
        }
    }

    int pos;
    for(int i=0;i<n;i++){
        if(s[i]!=s[0]){
            pos=i;break;
        }
    }
    int ok=0;
    for(int i=pos;i<n;i++){
        if(s[i]==s[0])ok=1;
    }

    if(ok){
        cout<<2<<endl;return;
    }else{
        cout<<1+min(b,3ll)<<endl;return;
    }
}

我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?

posted @ 2025-05-16 21:35  Marinaco  阅读(13)  评论(0)    收藏  举报
//雪花飘落效果