题意:
对输入的每个数都进行分配到两个多重集中,问分配完以后 每个多重集中的个数为1的元素是否相等 相等则输出一个分配方式, 不想等为NO
解析:
三种情况
1、原数列中个数为1 的数的个数为偶数 YES 集合A中只有一半个数为1的数, 其它的数在集合B中即可
2、原数列中个数为1的数的个数为奇数,且不存在个数大于等于3的数 NO
3、原数列中个数为1的数的个数为奇数,存在个数大于等于3的数 YES 先照1分配完 然后 把个数大于等于3的那个数 拿出一个放到A中 其它在B即可
#include <bits/stdc++.h> using namespace std; //const int maxn = 10010, INF = 07fffffff; const int maxn = 1000; int d[maxn], vis[maxn]; int main() { int flag = 0, tmp; int n, id = n-1; cin >> n; for(int i=0; i<n; i++) { cin >> d[i]; vis[d[i]]++; } int ans = 0; for(int i=1; i<=100; i++) { if(vis[i] == 1) ans++; if(vis[i] >= 3) flag = 1, tmp = i; } for(int i=0; i<n; i++) if(vis[d[i]] == 1) id = i; if(!(ans & 1)) { cout << "YES" << endl; int g = 0; for(int i=0; i<n; i++) { if(vis[d[i]] == 1 && g) cout<< "A"; else cout<< "B"; if(vis[d[i]] == 1) g ^= 1; } return 0; } if(flag == 0) return puts("NO"), 0; cout << "YES" << endl; int cnt = 0, f = 0; for(int i=0; i<n; i++) { if(cnt < ans/2 && vis[d[i]] == 1) { cout << "B"; cnt++; } else if(vis[d[i]] >= 3 && f == 0) { cout << "B"; f = 1; } else cout << "A"; } cout << endl; return 0; }
Vasya and Multisets CodeForces - 1051C(英语限制了我的想象力)
原文:https://www.cnblogs.com/WTSRUVF/p/9688361.html