吐龙珠、马祖问题(思维)

传送门
来源:牛客网

题目描述
n颗任意颜色的珠子摆成一排,现在你知道每个珠子的颜色种类以及珠子的总数目。
现在你有一颗颜色为x的珠子。你可以将这颗珠子插在这一排珠子中的任意位置,
一旦存在连续的相同颜色的珠子数目大于等于三颗,那么这些连续的珠子将被消除。
同时两边的珠子向中间靠拢,将被消除的部分填满,这个过程不改变珠子的相对顺序。
保证初始状态不存在连续的同颜色珠子的数目大于等于三颗。

问:由你决定x的插入位置,问最多可以消除的珠子的数目是多少。(插入的珠子不计算在内)

输入描述:
第一行输入一个整数t, 代表测试数目。(1<=t<=20)
第二行输入三个正整数n (n <= 100) 、k(k <= 100)以及x (x <= k)。 分别代表珠子的总数目、珠子的颜色数
以及初始时所拥有的珠子的颜色。
第三行输入n个正整数C1,C2…Cn(Ci <= k )。
输出描述:
每行输出一个整数代表最大能消除的珠子的数量
示例1
输入
复制
1
10 2 1
2 1 2 2 1 2 2 1 1 2
输出
复制
5
说明
显然将颜色为1的珠子插在第8颗珠子的前面,珠子顺序变成2 1 2 2 1 2 2 2,消除3颗珠子
又形成3个连续的颜色为2的珠子, 珠子顺序变成2 1 2 2 1, 消除3颗珠子
不存在连续的同颜色的珠子数目大于等于3, 结束。 答案为3 + 3 - 1 = 5(减去插入的珠子)

思路:从第一个插入后可消除的位置开始判断消除后左右位置相同颜色的珠子是否超过三个,若超过继续判断消除后左右位置颜色相同的珠子是否超过三个……若不满足则停止判断左右位置,记录下放入此位置时一共能消除的珠子的数量,并开始寻找下一个满足条件的位置并放入重复上述的判断……

#include <bits/stdc++.h>
using namespace std;
int main()
{  
    int T;
    cin>>T;
    while(T--)
    {
        int a[205],n,k,x,ans=0;//记录答案
        cin>>n>>k>>x;
        a[0]=-1,a[n+1]=-1;//标记左右边界
        for(int i=1;i<=n;i++)cin>>a[i];
        for(int i=2;i<=n;i++){
        	int cnt=0;//每次重新开始找初始时所拥有的珠子的颜色(x)放入后能消除的位置
        	if(a[i-1]==x&&a[i]==x){
        		cnt+=2;//放入后消除两个珠子
        		int l=i-2,r=i+1;
        		while(a[l]==a[r]){//判断左右珠子颜色是否相同
        			int num=2;//左右珠子(即两颗)
        			while(l>0&&a[l-1]==a[l]){//往左找,判断颜色是否相同
        				l--;
        				num++;//颜色相同,加1
					}
					while(r<=n&&a[r+1]==a[r]){//往右找,判断颜色是否相同
						r++;
						num++;//颜色相同,加1
					}
					if(num>=3){//至少三颗才能满足条件消除
						cnt+=num;//消除珠子的数量
                        l--,r++;//注意!!!因为下一次的循环判断是从消除珠子后旁边左右珠子开始,所以l和r都要到相应的珠子上才能继续进行判断
					}else break;//若不足三颗则不能消除,旁边的珠子也没机会消除辽
				}
			}
			ans=max(ans,cnt);//找最多消除数量
		}
		cout<<ans<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值