题解 | 小红的二分图构造

小红的二分图构造

https://www.nowcoder.com/practice/3ea0887a796b479ea9f336a8a97a405d

#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;
struct bo
{
	int xu;
	int shu;
};
bool zhao(bo a,bo b)
{
	return a.shu < b.shu;
}

int main()
{
	int m,s;cin >> m;
	vector<bo>tu(m);
	for (int i = 0;i < m;i++)
	{
		cin >> tu[i].shu;tu[i].xu = i + 1;
	}
	sort(tu.begin(), tu.end(),zhao);
		int num = 0;
		for (int i = 0;i < m;i++)
		{
			num += tu[i].shu;
		}
		if (num % 2 != 0)
		{
			cout << -1;
			return 0;
		}
		int tar = num / 2, a = 0, b = 0,zhui=0,zhao=0;
		while(b<m)
		{
			if (zhui == tar)
			{
				zhao = 1;
				break;
			}
			zhui += tu[b].shu;
			if (zhui == tar)
			{
				zhao = 1;
				break;
			}
			if (zhui < tar)b++;
			while(zhui > tar)
			{
				zhui += -tu[a].shu;
				a++;
			}
		}
		if (zhao)
		{
			vector<int>combo1;
			vector<int>combo2;
			for (int i = a;i <= b;i++)
			{
				for (int j = tu[i].shu;j > 0;j--)
					combo1.push_back(tu[i].xu);
			}
			for (int i = 0;i < a;i++)
			{
				for (int j = tu[i].shu;j > 0;j--)
					combo2.push_back(tu[i].xu);
			}
			for (int i = b+1;i <m;i++)
			{
				for (int j = tu[i].shu;j > 0;j--)
					combo2.push_back(tu[i].xu);
			}
			cout << combo1.size() << endl;
			for (int i = 0;i < combo1.size();i++)
			{
				cout << combo1[i] <<" "<< combo2[i] << endl;
			}
		}
		else cout << -1;
}
	

全部评论
通过了用例 感觉会有遗漏情况?
点赞 回复 分享
发布于 09-28 23:15 江苏

相关推荐

点赞 评论 收藏
分享
10-10 16:30
济宁学院 Java
不想做程序员:面试官:蓝桥杯三等奖?你多去两次厕所都能拿二等吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务