J - CONTINUE...? (某次浙江省赛的一道题。)

这道题的大体意思是这样的,有一个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;
}

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭