1931C. Make Equal Again

题目:

https://codeforces.com/problemset/problem/1931/C

题目解读:

1.首先输入测试项的数量t。

2.逐个输入t个测试项,第一行包含数组中元素的个数,第二行逐个输入元素。

3.输出能够不间断地替换数组中的一段元素使得数组全部元素变成一致的最小的元素个数。

解题流程:

1.如果数组中元素全部一致或者只有一个元素直接输出0。(定义一个flag来标记数组中是否全部一致)

2.当数组中有不同元素时。定义k1和k2分别来计数从前往后和从后往前连续相同元素的个数,利用for循环求出,期间分别定义flag1和flag2用来判断是否相同的数不再连续,不再连续后续k的值不再改变。

3.输出的时候分为两种情况:

(1)a[1]==a[n],直接输出n-(k1+k2);

   (2) a[1]!=a[n],输出n-max(k1,k2)。

#include<bits/stdc++.h>
using namespace std;

int main()
{
	ios_base::sync_with_stdio(0);cin.tie(0);
	int t;
	cin>>t;
	while(t--)
	{
		
		int n,flag=0;
		cin>>n;
        int a[n+1];
        
        for(int i=1;i<n+1;i++)
        {
        cin>>a[i];
   		if(i>1) {if(a[i-1]!=a[i]) flag=1;}
		}
		if(!flag||n==1)
		{cout<<0<<'\n';}
		else
		{
			int k1=1,k2=1;
			int flag1=1,flag2=1;
			//求出前后相同数的个数
			for(int  i=2,j=n-1;i<n,j>1;i++,j--)
		{
			if(a[i]==a[1]&&flag1)
				k1++;
			else
			    flag1=0;
			if(a[j]==a[n]&&flag2)
				k2++;
			else
				flag2=0;
		}
		if(a[1]==a[n])
			cout<<(n-(k1+k2))<<'\n';
		else
			cout<<(n-max(k1,k2))<<'\n';
		}
	}
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值