这道题的大体意思是这样的,有一个0(女)和1(男)组成的字符串,对于每一个男生和女生。他们的编号就是他们拥有宝石的数量(从1开始),你要做的事把他们分成G1,G3,G3,G4四个组,前两个为女,后两个为男,你要让G1,G3所拥有的宝石总数等于G2,G4男女拥有的宝石总数,然后输出每个人分别对应的组号。
开始你想的话,会发现,不管男女各多少宝石各多少,只要他们的宝石数为偶数就能分组,基数则不能,所以按照这个想法,先整一个结构体出来,a用来标记G1,G3大组和G2,G4大组(初始的时候全为0),aa则为那个字符串对应的数字串,我先用sum把总宝石数求出来,基数直接输出-1跳过,如果是偶数,我让他的和变为一半分别给两个大组,这样就保证他们个总数相等,如果pl的总数和小于一半就让他加,大于则跳过去另一组,我让pl加过的标记为1(G1 , G3组),分完之后就是输出了,如果他是G1G3组的,0(女)就输出1,1(男)就输出3,同理输出G2,G4.
这道题我觉得我自己是做不出来的,这是问了别人之后才有的想法,感觉自己学得好慢,加油吧,下面是这道题的代码,第一次写博客,可能有不足,见谅!
#include"stdio.h"
#include"string.h"
#include"algorithm"
using namespace std;
struct zjq
{
bool a;
int aa;
}q[10005];
int main()
{
int t;
while(~scanf("%d",&t))
{
while(t--)
{
int n , i;
int sum=0;
char b[200005];
scanf("%d",&n);
scanf("%s",b);
for(i=0 ; i<n ; i++)
{
sum=sum+(i+1);
q[i].a=0;
q[i].aa=b[i]-'0';
}
if(sum%2)
{
printf("-1\n");
continue;
}
int pl=0;
sum=sum/2;
for(i=n-1 ; i>=0 ; i--)
{
if(pl>sum)
{
continue;
}
pl=pl+q[i].aa;
q[i].a=1;
}
for(i=0 ; i<n ; i++)
{
if(q[i].a==1)
{
if(q[i].aa==0)
{
printf("1");
}
else
{
printf("3");
}
}
else
{
if(q[i].aa==0)
{
printf("2");
}
else
{
printf("4");
}
}
}
puts("");
}
}
return 0;
}