Codeforces 1138B B. Circus

暴力啊,先随便乱分,然后算A和C的差值,然后枚举所有可以让差值变小的两个数进行交换,注意可能会在枚举中陷入死循环,设置一个标记跳出就行。

Code:

#include <bits/stdc++.h>
using namespace std;
int a[5005], c[5005], flag[5005];
set<int>aa1, cc1, ac1, other1, aa2, cc2, ac2, other2;
vector<int>ans;
int main()
{
	int n;
	char ch;
	scanf("%d", &n);
	getchar();
	for (int i = 1; i <= n; i++)
	{
		scanf("%c", &ch);
		c[i] = ch - '0';
	}
	getchar();
	for (int i = 1; i <= n; i++)
	{
		scanf("%c", &ch);
		a[i] = ch - '0';
	}
	int cc = 0, aa = 0, ac = 0, other = 0;
	//flag 1    2      3       4 
	for (int i = 1; i <= n; i++)
	{
		if (c[i] == 1)
		{
			if (a[i]) 
			{
				ac++;
				flag[i] = 3;
			}
			else
			{
				cc++;
				flag[i] = 1;
			}
		}
		else
		{
			if (a[i])
			{
				aa++;
				flag[i] = 2;
			}
			else
			{
				other++;
				flag[i] = 4;
			}
		}
	}
	int num1 = 0, num2 = 0;
	for (int i = 1; i <= n / 2; i++)
	{
		switch (flag[i])
		{
		case 1:cc1.insert(i);break;
		case 2:aa1.insert(i); num1++; break;
		case 3:ac1.insert(i); num1++; break;
		case 4:other1.insert(i); break;
		}
	}
	for (int i = n / 2 + 1; i <= n; i++)
	{
		switch (flag[i])
		{
		case 1:cc2.insert(i); num2++; break;
		case 2:aa2.insert(i); break;
		case 3:ac2.insert(i); num2++; break;
		case 4:other2.insert(i); break;
		}
	}
	int cnt = 0;
	while (num1 < num2 && cnt++ < 10000)
	{
		if (other1.size() != 0)
		{
			if (aa2.size() != 0)
			{
				num1++;
				aa1.insert(*aa2.begin());
				aa2.erase(aa2.begin());
				other2.insert(*other1.begin());
				other1.erase(other1.begin());
			}
			else if (cc2.size() != 0)
			{
				num2--;
				cc1.insert(*cc2.begin());
				cc2.erase(cc2.begin());
				other2.insert(*other1.begin());
				other1.erase(other1.begin());
			}
			else if (ac2.size() != 0 && num1 + 2 <= num2)
			{
				num1++;
				num2--;
				ac1.insert(*ac2.begin());
				ac2.erase(ac2.begin());
				other2.insert(*other1.begin());
				other1.erase(other1.begin());
			}
		}
		if (num1 == num2)
			break;
		if (cc1.size() != 0)
		{
			if (ac2.size() != 0)
			{
				num1++;
				ac1.insert(*ac2.begin());
				ac2.erase(ac2.begin());
				cc2.insert(*cc1.begin());
				cc1.erase(cc1.begin());
			}
		}
	}
	cnt = 0;
	while (num2 < num1 && cnt++ < 10000)
	{
		if (other2.size() != 0)
		{
			if (cc1.size() != 0)
			{
				num2++;
				cc2.insert(*cc1.begin());
				cc1.erase(cc1.begin());
				other1.insert(*other2.begin());
				other2.erase(other2.begin());
			}
			else if (aa1.size() != 0)
			{
				num1--;
				aa2.insert(*aa1.begin());
				aa1.erase(aa1.begin());
				other1.insert(*other2.begin());
				other2.erase(other2.begin());
			}
			else if (ac1.size() != 0 && num2 + 2 <= num1)
			{
				num1--;
				num2++;
				ac2.insert(*ac1.begin());
				ac1.erase(ac1.begin());
				other1.insert(*other2.begin());
				other2.erase(other2.begin());
			}
		}
		if (num1 == num2)
			break;
		if (aa2.size() != 0)
		{
			if (ac1.size() != 0)
			{
				num2++;
				ac2.insert(*ac1.begin());
				ac1.erase(ac1.begin());
				aa1.insert(*aa2.begin());
				aa2.erase(aa2.begin());
			}
		}
	}
	if (num1 != num2)
		printf("-1");
	else
	{
		for (auto it = aa2.begin(); it != aa2.end(); it++)
			ans.push_back(*it);
		for (auto it = cc2.begin(); it != cc2.end(); it++)
			ans.push_back(*it);
		for (auto it = ac2.begin(); it != ac2.end(); it++)
			ans.push_back(*it);
		for (auto it = other2.begin(); it != other2.end(); it++)
			ans.push_back(*it);
		for (int i = 0; i < ans.size(); i++)
			printf("%d%c", ans[i], i == ans.size() - 1 ? '\n' : ' ');
	}
}

 

全部评论

相关推荐

11-15 18:39
已编辑
西安交通大学 Java
全村最靓的仔仔:卧槽,佬啥bg呢,本也是西交么
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务