题目:
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;
}