题目大意:给出一个多重集(集合里可以包含多个相同的数),并定义在集合中只出现一次的数为nice number,要求把这个多重集分成两个多重集A,B,并且这两个集合中的nice number要相同,
题目链接:http://codeforces.com/contest/1051/problem/C
思路:分三种情况:情况一:如果多重集中的nice number(只出现一次的数)为偶数,则对半分给两个集合,其他的数全分到B集即可。
情况二:如果多重集中nice number为奇数,且集合中不存在出现次数大于等于3的数,则无法非配。
情况三:如果多重集中nice number为奇数,且集合中存在出现次数大于等于三的数,则给A分一个,其他全分给B
c++代码:
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int maxn=105;
int a[maxn];
char ans[maxn];
vector<int> v[maxn];
int main() {
int n;
cin >> n;
memset(v,0,sizeof(v));
for(int i=0;i<n;i++) {
cin >> a[i];
v[a[i]].push_back(i);
}
int cnt=0,cnt1=0;
for(int i=1;i<=100;i++) {
if(v[i].size()==1)cnt++;
else if(v[i].size()>=3)cnt1++;
}
if(cnt%2&&!cnt1)cout << "NO" << endl;
else {
//if(cnt%2==0) {
int t=0;
bool flag=0;
for(int i=1;i<=100;i++) {
if(!v[i].size())continue;
if(v[i].size()==1) {
t++;
if(t%2==0)ans[v[i][0]]='A';
else ans[v[i][0]]='B';
}
if(v[i].size()>1&&cnt%2==0) {
for(int j=0;j<v[i].size();j++)
ans[v[i][j]]='A';
}
else if(cnt%2&&v[i].size()>1) {
if(v[i].size()==2||(flag&&v[i].size()>=3)) {
for(int j=0;j<v[i].size();j++)
ans[v[i][j]]='B';
}
if(v[i].size()>=3&&!flag) {
flag=1;
ans[v[i][0]]='A';
for(int j=1;j<v[i].size();j++)
ans[v[i][j]]='B';
}
}
}
//}
cout <<"YES" <<endl;
for(int i=0;i<n;i++) {
cout << ans[i];
}
cout << endl;
}
return 0;
}