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

本文详细解析了Codeforces比赛中的C题,针对多重集分割问题,提出了三种解决策略:当nicenumber为偶数时的平均分配方法,当nicenumber为奇数且不存在大于等于3次元素时的无解情况,以及当nicenumber为奇数但存在大于等于3次元素时的特殊处理方案。附带c++代码实现。
摘要由CSDN通过智能技术生成

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值