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;
}