链接
题意:
这道题的意思其实就是,给你三个背包: 每一次任选两个背包,在这两个背包中分别取出 a , b a,b a,b这两个数(不放回),同时用 a − b a-b a−b来替换 a a a,那么经过数次操作以后,这三个背包中就只剩下一个数字了,请问这个数字的最大值。 输入格式是:第一行分别代表了这三个背包的背包容量,之后的三行分别代表的是这三个背包的全部数字。
分析:
首先两种方式最优:
- 有一个集合的贡献都是负的,其他的都是正的,这样只用负集合来将整的集合整合也就是(-a-b)这样最后整合到一个负数和一个正数然后在化正
- 有两个不同集合中各有一个贡献为负的,其他贡献是正的,为什么是两个不同集合那,一个本集合的无法由本集合中的数化正,只能借用另两个集合。
void solve()
{
cin >> n >> m>>k;
ll max1,max2,max3;
ll sum1,sum2,sum3;
sum1=sum2=sum3=0;
max1=max2=max3=1e18;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
max1=min(max1,a[i]);
sum1+=a[i];
}
for(int i=1;i<=m;i++){
scanf("%lld",&b[i]);
max2=min(max2,b[i]);
sum2+=b[i];
}
for(int i=1;i<=k;i++){
scanf("%lld",&c[i]);
max3=min(max3,c[i]);
sum3+=c[i];
}
ll ans=0;
ans=max(ans,sum1+sum2-sum3);
ans=max(ans,sum1-sum2+sum3);
ans=max(ans,-sum1+sum2+sum3);
ans= max(ans,sum1+sum2+sum3-2*min(max1+max2,min(max1+max3,max2+max3)));
cout<<ans<<endl;
}