题目
题目描述
题目的意思比较简单,首先是mex函数,这个是博弈里面的一个经典函数。把一个数组分成两个子数组,使得mex和最大。
题目解析
首先考虑Mex代表这个集合不出现的最小的非负整数,如果这个集合没有0存在,那么直接就是0.贪心的考虑就是把这个数组分割成两个个最长的连续底层的序列。这样得到的mex值就是最大的。所以模拟一下这个分割的过程即可
代码
#include <iostream>
#include <map>
using namespace std;
int main(){
ios::sync_with_stdio(false);
int T;cin>>T;
while(T--){
int n;cin>>n;
map<int,int>mp;
for(int i=1;i<=n;i++){
int a;cin>>a;
mp[a]++;
}
int ans=0;
for(int i=0;i<200;i++){
if(mp.find(i)!=mp.end()&&mp[i]!=0){
mp[i]--;
}else{
ans+=i;
break;
}
}
for(int i=0;i<200;i++){
if(mp.find(i)==mp.end()||(mp.find(i)!=mp.end()&&mp[i]==0)) {
ans+=i;
break;
}
}
cout<<ans<<endl;
}
}