CF920 D. Very Different Array(排序+贪心)

题意:a数组n个数字给定,b数组m个数字中选出n个,与a数组对应差的绝对值和最大。

分析:如果b数组也是n个数字,那么a和b排序后,a最小匹配b最大(a1 bn),依次(a2 bn-1).。。。。。

现在b数组数量多过a数组,那么选取规则(贪心)就演变成b数组前面的k个数字和a数组后k个数字匹配。b数组后面n-k个数字和a数组前n-k个匹配。如图:

为求出这个合适的K值,需要枚举。下面代码先从k=n开始计算,当k为n-1时,原本abs(a1-bn)变为abs(a1-bm),依次类推。

#include <bits/stdc++.h>
using namespace std;
int n,m,a[200005],b[200005];
int main()
{
    int t,i,j;
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        for(i=1; i<=n; i++)
            cin>>a[i];
        sort(a+1,a+n+1);
        for(i=1; i<=m; i++)
            cin>>b[i];
        sort(b+1,b+m+1);
        long long ans=0,sum=0,l=1,r=m;
        for(i=1; i<=n; i++)/**< 先选取b中前n个元素为初始值 */
            sum+=abs(a[i]-b[n-i+1]);
        ans=sum;
        for(i=1;i<=n;i++)
        {  /**< 递推求出b选取前n-i个元素*/
            sum=sum-abs(a[i]-b[n-i+1])+abs(a[i]-b[m-i+1]);
            ans=max(ans,sum);
        }
        cout<<ans<<endl;
    }
    return 0;
}

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值