1. 程式人生 > >Vasya and Multisets CodeForces - 1051C(英語限制了我的想象力)

Vasya and Multisets CodeForces - 1051C(英語限制了我的想象力)

存在 分配 元素 == color ons 不想 inf end

題意:

  對輸入的每個數都進行分配到兩個多重集中,問分配完以後 每個多重集中的個數為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(英語限制了我的想象力)