Codeforces Round #695 (Div. 2) C. Three Bag (思维+贪心)

链接

题意:

这道题的意思其实就是,给你三个背包: 每一次任选两个背包,在这两个背包中分别取出 a , b a,b a,b这两个数(不放回),同时用 a − b a-b ab来替换 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;
 
}

你可能感兴趣的:(贪心,思维,c语言,贪心算法,开发语言)