CodeForces - 1476D Three Bags 思维
CodeForces - 1476D Three Bags 思维
题意
给定三个可重集合,分别装有\(n1,n2,n3\)个数,每一次操作可以从一个集合中取出\(b\),在另一个集合中取出元素\(a\),将\(a\)替换为\(a - b\)
最终会在所有集合中仅剩一个数,求出那个数最大是多少
\[1 \leq n \leq 3\times 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;
}