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;
}
}
我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?我怎么这么菜?

浙公网安备 33010602011771号