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 = ;
int d[maxn], vis[maxn]; int main()
{
int flag = , tmp; int n, id = n-;
cin >> n;
for(int i=; i<n; i++)
{
cin >> d[i];
vis[d[i]]++;
}
int ans = ;
for(int i=; i<=; i++)
{
if(vis[i] == )
ans++;
if(vis[i] >= )
flag = , tmp = i;
}
for(int i=; i<n; i++)
if(vis[d[i]] == )
id = i;
if(!(ans & ))
{
cout << "YES" << endl;
int g = ;
for(int i=; i<n; i++)
{
if(vis[d[i]] == && g)
cout<< "A";
else
cout<< "B";
if(vis[d[i]] == )
g ^= ;
}
return ;
} if(flag == )
return puts("NO"), ;
cout << "YES" << endl;
int cnt = , f = ;
for(int i=; i<n; i++)
{
if(cnt < ans/ && vis[d[i]] == )
{
cout << "B";
cnt++;
}
else if(vis[d[i]] >= && f == )
{
cout << "B";
f = ;
}
else
cout << "A";
}
cout << endl; return ;
}
上一篇:网站开发进阶(二十八)初探localStorage


下一篇:Win7中的IIS配置asp时出现“出现403 文件夹禁止訪问错误”!