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

题意:

  对输入的每个数都进行分配到两个多重集中,问分配完以后 每个多重集中的个数为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;
}

 

posted @ 2018-09-21 20:33  WTSRUVF  阅读(493)  评论(0编辑  收藏  举报