Educational Codeforces Round 51 (Rated for Div. 2) C. Vasya and Multisets

题目大意:给出一个多重集(集合里可以包含多个相同的数),并定义在集合中只出现一次的数为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;
}

猜你喜欢

转载自blog.csdn.net/qq_39475280/article/details/82941549