alt alt alt alt

--------------以下是主题部分----------------------------------

可以选择一个子数组替换为整数MEX(b),首先我们知道如果选择的子数组中没有0,那么所有数会被替换为0,相反,如果选择的子数组中有0,那么所有数会被替换成一个正整数,问最少操作几次可以把所有数替换为0。

  1. 我们可以简单地发现如果原数组都为0,那么操作次数为0。
  2. 如果数组中有为0的数且连成一块,那么我们只需要把所有数都替换成0即可,操作次数为1。
  3. 如果数组中不为0的数没有连成一块,那么我们可以选择除边缘非0整数之外的数替换成一个正整数,在把整块非0整数都替换成0,操作次数为2。

------------以下是代码部分-------------------------------------

using namespace std;

int a[55];
int n;
int main(){
	int t;
	cin>>t;
	while(t--){
		cin>>n;
		int tot=0;
		int flag=0;
		int flag2=0;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			if(a[i]==0) tot++;
			if(flag&&a[i]!=0&&a[i-1]==0) flag2=1;
			if(a[i]!=0&&a[i-1]==0) flag=1;
			
		}
		if(tot==n) cout<<0<<endl;
		else{
			if(flag==1&&flag2==1) cout<<2<<endl;
			else cout<<1<<endl;
		}
	}

	return 0;
}

-----------------以下是反思部分-----------------------

需要发现数组的特殊性,用贪心思想选择最小的次数。