CodeForces

CodeForces - 1476D Three Bags 思维

题意

给定三个可重集合,分别装有(n1,n2,n3)个数,每一次操作可以从一个集合中取出(b),在另一个集合中取出元素(a),将(a)替换为(a - b)

最终会在所有集合中仅剩一个数,求出那个数最大是多少

[1 leq n leq 3 imes 10^5\ a_i leq 10^9 ]

分析

容易发现一个数经过偶数次中转为正,否则为负

通过观察样例,容易贪心构造出两种方案:

选出来自不同的集合的且最小的两个数,将这两个数作为中转,那么最后只有这两个数会转移一次

还有一种方法是 牺牲一个集合作为中转集合,其他所有集合都通过这个集合进行中转,这样显然也可能达到最优解

最终只需在两种方法中取最大即可

做这类规律题一定要冷静仔细分析

代码

int main(){
	int n1 = rd();
	int n2 = rd();
	int n3 = rd();
	vector<ll> Sum;
	vector<ll> v1,v2,v3;
	ll sum = 0;
	for(int i = 0;i < n1;i++)
		v1.push_back(rd()),sum += v1.back();
	Sum.push_back(sum);
	sum = 0; 
	for(int i = 0;i < n2;i++)
		v2.push_back(rd()),sum += v2.back();
	Sum.push_back(sum);
	sum = 0;
	for(int i = 0;i < n3;i++)
		v3.push_back(rd()),sum += v3.back();
	Sum.push_back(sum);
	ll ans = Sum[0] + Sum[1] + Sum[2];
	sort(v1.begin(),v1.end());
	sort(v2.begin(),v2.end());
	sort(v3.begin(),v3.end());
	sort(Sum.begin(),Sum.end());
	ans -= 2 * min(Sum[0],min(v1[0] + v2[0],min(v2[0] + v3[0],v1[0] + v3[0])));
	cout << ans;
}
原文地址:https://www.cnblogs.com/hznumqf/p/14378989.html