正式自己,找到问题,然后解决
A 消消乐
题意:
n颗任意颜色的珠子摆成一排,现在你知道每个珠子的颜色种类以及珠子的总数目。
现在你有一颗颜色为x的珠子。你可以将这颗珠子插在这一排珠子中的任意位置,
一旦存在连续的相同颜色的珠子数目大于等于三颗,那么这些连续的珠子将被消除。
同时两边的珠子向中间靠拢,将被消除的部分填满,这个过程不改变珠子的相对顺序。
保证初始状态不存在连续的同颜色珠子的数目大于等于三颗。
问:由你决定x的插入位置,问最多可以消除的珠子的数目是多少。(插入的珠子不计算在内)
思路:
看题意不难想到模拟,可惜自己没想清楚写的暴力超时了,加上两次读错题受了影响,这题本质上是很容易的,看清楚题意是三个以上就可以全部消除,而且输入不存在三个以上的相连,那么就枚举我射弹珠的每个位置,然后模拟,类似双指针的跑法,去删除一连串的即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+100;
int c[maxn];
int main()
{
int n,i,j,k,t,x;
cin>>t;
while(t--)
{
cin>>n>>k>>x;
for(i=0;i<n;i++)
{
cin>>c[i];
}
int ans=0;
for(int q=0;q<n+1;q++)
{
vector<int> a;
for(int d1=0;d1<n;d1++) a.push_back(c[d1]);
a.insert(a.begin()+q,x);
int flag=0,cnt=0,l=i,r=i,d1=x,cnt1=0;
while(1)
{
int flag=0;
int len=a.size();
for(i=0;i< len-2;i++)
{
if(a[i]==a[i+1]&&a[i+1]==a[i+2])
{
int r=i,d1=a[i];
while(r<n&&a[r]==d1){
r++;
}
a.erase(a.begin()+i,a.begin()+r);
flag=1;
break;
}
}
if(flag==0){
break;
}
}
ans=max(n-(int)(a.size()),ans);
}
cout<<ans<<endl;
}
return 0;
}