测试样例
input
4
6
0 2 1 5 0 1
3
0 1 2
4
0 2 0 1
6
1 2 3 4 5 6
output
5
3
4
0
Note
In the first test case, A={0,1,2},B={0,1,5} is a possible choice.
In the second test case, A={0,1,2},B=∅ is a possible choice.
In the third test case, A={0,1,2},B={0} is a possible choice.
In the fourth test case, A={1,3,5},B={2,4,6} is a possible choice.
题意: 给你一个整数序列,你可以将这个序列分成两个集合A和B,分成集合的条件为它们必须要有相同的元素或者其中一个为空集。现定义一种运算:其值为A中未出现的最小非负整数。
解题思路: 很显然这道题是一道贪心的算法题,由于我们的mex运算是选择未出现的最小非负整数,**那么我们固然是想构建一个从0到最大的集合,这样,它就可以选取一个最大的数了。这就是我们贪心的思路。**所以我们需要先构建一个集合。(构建的思路就是统计每个数的出现次数,若加入集合,则次数减1.)OK,具体看代码。
AC代码
/*
*
*/
//POJ不支持
//i为循环变量,a为初始值,n为界限值,递增
//i为循环变量, a为初始值,n为界限值,递减。
using namespace std;
const int inf = 0x3f3f3f3f;//无穷大
const int maxn = 1e2+3;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
//*******************************分割线,以上为自定义代码模板***************************************//
int t,n;
int cnt[maxn];
int main(){
//freopen("in.txt", "r", stdin);//提交的时候要注释掉
IOS;
while(cin>>t){
while(t--){
cin>>n;
memset(cnt,0,sizeof(cnt));
int temp;
rep(i,0,n-1){
cin>>temp;
cnt[temp]++;
}
int ans=0;
rep(i,0,101){
if(cnt[i]>=1){
cnt[i]--;
}
else{
ans+=i;
break;
}
}
rep(i,0,101){
if(cnt[i]>=1){
}
else{
ans+=i;
break;
}
}
cout<<ans<<endl;
}
}
return 0;
}