题目描述
n颗任意颜色的珠子摆成一排,现在你知道每个珠子的颜色种类以及珠子的总数目。
现在你有一颗颜色为x的珠子。你可以将这颗珠子插在这一排珠子中的任意位置,
一旦存在连续的相同颜色的珠子数目大于等于三颗,那么这些连续的珠子将被消除。
同时两边的珠子向中间靠拢,将被消除的部分填满,这个过程不改变珠子的相对顺序。
保证初始状态不存在连续的同颜色珠子的数目大于等于三颗。
问:由你决定x的插入位置,问最多可以消除的珠子的数目是多少。(插入的珠子不计算在内)
分析
将所有可能插入的位置进行枚举,将插入珠子x后的新数组进行是否可以消除的判断,
C++代码
#include<bits/stdc++.h>
using namespace std;
int T,n,k,x,a[110];
int main()
{
cin>>T;
while(T--)
{
cin>>n>>k>>x;
for(int i=0;i<n;i++) cin>>a[i];
int ans=INT_MAX;
for(int p=0;p<n;p++) //枚举所有插入的位置pos
{
vector<int> v;
for(int i=0;i<p;i++) v.push_back(a[i]);
v.push_back(x); //在该位置插入珠子
for(int i=p;i<n;i++) v.push_back(a[i]);
while(1)
{
bool flag=0; //判断是否本轮进行了消除
int len=v.size();
for(int i=2;i<len;i++)
{
if(v[i]==v[i-1] && v[i-1]==v[i-2]) //相邻的三个珠子相同
{
int j=i;
while(j<len && v[j]==v[i]) j++; //j枚举右边界
v.erase(v.begin()+i-2,v.begin()+j); //使用erase函数消除在[i-2,j)之间的所有元素
flag=1;
break;
}
}
if(!flag) break; //如果本轮没有消除,直接跳出while循环
}
ans=min(ans,(int)v.size());
}
if(ans==n+1) cout<<0<<endl;
else cout<<n-ans<<endl;
}
return 0;
}