Vasya and Multisets
万圣节到了,杰哥准备给班级里的同学发糖吃,男生女生各一堆。于是他去腐败街的xx小卖部买糖,他认为糖只要是独一无二的那他就是好糖,他跟老板说他想要买n个不一样的糖,但是老板是个黑心商贩,当杰哥把糖带回去的时候才发现有挺多相同的糖
而杰哥是一个公平正直的人,他希望男生女生两堆糖中好糖的数量相同,于是他想找你帮忙来解决他的烦恼。
为了简化问题我们将不同的糖用不用的数字表示。
Input
第一行输入一个整数 n(2<=n<=100)
第二行输入n个整数 s1,s2,...sn(1<=si<=100)表示第i个糖是哪种糖
Output
如果杰哥无法将这些糖合理的分成2份则输出一行"NO"
如果可以 则输出一行"YES"下一行输出n个字符,第i个字符表示第i个糖属于男生还是女生(女生输出A,男生输出B)
情况有多种,任选一种情况输出即可。
Examples
Input
4
3 5 7 1
Output
YES
BABA
Input
3
3 5 1
Output
NO
题目思路:比赛的时候想着独一无二的糖可能是n所有糖里唯一的或者是每一堆的唯一。然后用第一种实现了之后,找了下bug,感觉没问题之后就又用第二种实现了一下。
如果是每一堆的唯一那就找所有里的唯一的数量ans,如果ans%2==0,那就把所有里唯一的糖平分,然后剩下的都给一堆
如果ans%2==1,那就把所有里唯一的糖平分了之后,再把一种数量大于2的糖分一颗给 之前少一颗的那一堆,剩下的所有糖都归另一堆。
但是最后还是没A,大概是代码实现的不对,然后结束后改了一下就过了
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
using namespace std;
int vis[105],a[105],c[105],d[105];
int main()
{
int n;
scanf("%d",&n);
memset(vis,0,sizeof(vis));
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
vis[a[i]]++;
}
int ans=0,cnt=0;
for(int i=1; i<=100; i++)
{
if(vis[i]==1)
c[ans++]=i;
else if(vis[i]>2) cnt++;
}
// printf("%d\n",cnt);
if(ans%2&&cnt==0) printf("NO\n");
else
{
int k=0,k1=0;
printf("YES\n");
for(int i=0; i<n; i++)
{
int flag=0;
for(int j=0; j<ans; j++)
if(a[i]==c[j])
{
flag=1;
if(k%2)
printf("A");
else printf("B");
k=!k;
break;
}
if(!flag)
{
if(k1==0&&ans%2&&vis[a[i]]>2)
{
printf("A");
k1=1;
}
else printf("B");
}
}
printf("\n");
}
return 0;
}