题目
题解思路
因为题目的数据量比较少,直接哈希每个数出现的个数。从0遍历出现的次数,当出现的个数为1时,每次分给其中一个(挑一个存大的),然后将小的标记不向前了,(因为次数缺少了数,两个集合总有一个只能mex这个值)。为0时,遍历中断,为最大的mex值。两个相加即可!
AC代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int p[200];
int main ()
{
int t;
cin>>t;
while(t--)
{
memset(p,0,sizeof(p));
int n;
cin>>n;
for (int i = 1 ; i <= n ; i++ )
{
int tp;
cin>>tp;
p[tp]++;
}
int x1 = 0 ,x2 = 0 ,book = 0 ;
for (int i = 0 ; i <= 100 ; i++ )
{
if (p[i] >= 2 )
{
}else if ( p[i] == 1)
{
x1 = i+1;
if (book == 0)
{
book = 1;
x2 = i;
}
}else
{
x1 = i;
if (book == 0)
x2 = i;
break;
}
}
cout<<x1+x2<<"\n";
}
return 0;
}