? - Virtual Judge (vjudge.net)
题意:
给定一个长度为n的数列a,你可以重排这个数列
现在想问你怎么重排可以使得
最小
思路:
基于贪心的构造
就0 1 2这么猜过去
当mex=0的时候,应该是0 x 0 x ....这样子构造
但是这样的前提是(N+1)/2>=cnt_0
当mex=1的时候,避免把0和1搞在一起就行
当所有数都是0的时候,mex=1
否则就是mex=2
Code:
#include <bits/stdc++.h>
#define int long long
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
const int mxn=3e5+10;
const int mxe=3e5+10;
const int mod=1e9+7;
int N;
int a[mxn];
void solve(){
cin>>N;
for(int i=1;i<=N;i++) cin>>a[i];
int cnt_0=0,ok=0;
for(int i=1;i<=N;i++){
if(a[i]==0) cnt_0++;
if(a[i]>=2) ok=1;
}
if(cnt_0<=(N+1)/2) cout<<0<<'\n';
else if(ok||cnt_0==N) cout<<1<<'\n';
else cout<<2<<'\n';
}
signed main(){
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int __=1;cin>>__;
while(__--)solve();return 0;
}