首页 > 其他 > 详细

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

时间:2018-09-21 20:42:28      阅读:198      评论:0      收藏:0      [点我收藏+]

题意:

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!