CF1678A题解

题目:

传送门

思路:

判断数据中有没有 \(0\),如果数据中有 \(0\) 就统计数据中 \(0\) 的数量 \(t\),操作次数为 \(n-t\);若数据中没有 \(0\),就找有没有相同的数字,如果有就用一次操作把其中一个数变成 \(0\),然后就用 \(n-1\) 次操作把其他数全部变成了 \(0\),总操作次数为 \(n\);否则就先用一次操作把其中两个数变成其中较小的那个数,再用一次操作把其中一个数变成 \(0\),最后用 \(n-1\) 次操作把所有的数变成 \(0\),总操作数为 \(n+1\)

代码:

#include <bits/stdc++.h>
  using namespace std;
int n,m,a,d,i;
bool b[105],c;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>m;
	while (m--)
	{
		c=0;//别忘了清零。 
		d=0;
		for (i=0;i<=100;i++)
		{
			b[i]=0;
		}
		cin>>n;
		for (i=1;i<=n;i++)
		{
			cin>>a;
			if (!a) d++;//统计数据中 0 的数量。 
			else
			{
				if (b[a]) c=1;//判断数据中是否有两个数相同。 
				b[a]=1;
			}
		}
		if (d) cout<<n-d<<endl;//如果数据中有 0。 
		else if (c) cout<<n<<endl;//如果数据没有 0 但有重复 的数字。 
		else cout<<n+1<<endl;//如果数据中既没有 0,又没有重复的数字。 
	}
	return 0;
}
posted @ 2022-05-12 21:20  Jason142  阅读(23)  评论(0编辑  收藏  举报