题目链接:https://codeforces.ml/contest/1467/problem/C
题意:有三个背包,里面各自装了数, 每次可以选择任意两个非空背包,取其中一个数a和b 然后变成
a-b 放回 a背包中,b背包中的该数消失 直到最后只剩下一个数, 问剩下的数最大为多少
思路:考虑最后所有的数都会归到一个数的身上,这个数 给的贡献不是正数就是负数,取决于中间走了几步
奇数为负数,偶数为正数, 所有最后的答案是 总的sum-2*sub , ×2是为了抵消掉负数加进去sum的贡献
那么就只有几种情况, 要么是某两个背包的最小的数来作为跳板, 要么是只用某一个背包的最小数来作为跳板变成正数
然后 这一个背包的数 全部当作负数贡献
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=3e5+10; 4 const int mod=1e8; 5 #define ll long long 6 #define pb push_back 7 ll a[maxn],b[maxn],c[maxn]; 8 9 10 11 int main() 12 { 13 ios::sync_with_stdio(0); 14 cin.tie(0); 15 int n1,n2,n3; 16 cin>>n1>>n2>>n3; 17 ll sum1=0,sum2=0,sum3=0; 18 for(int i=1;i<=n1;i++) 19 cin>>a[i],sum1+=a[i]; 20 for(int i=1;i<=n2;i++) 21 cin>>b[i],sum2+=b[i]; 22 for(int i=1;i<=n3;i++) 23 cin>>c[i],sum3+=c[i]; 24 ll ans=0; 25 sort(a+1,a+1+n1); 26 sort(b+1,b+1+n2); 27 sort(c+1,c+1+n3); 28 ll min1=1e18; 29 ans=sum1+sum2+sum3; 30 min1=min({sum1,sum2,sum3}); 31 min1=min({min1,a[1]+b[1],a[1]+c[1],b[1]+c[1]}); 32 ans-=min1*2; 33 cout<<ans<<'\n'; 34 35 36 37 38 39 40 }View Code