Codeforces Round 920 (Div. 3) D. Very Different Array (贪心)

Petya 有一个由 n n n 个整数组成的数组 a i a_i ai 。他的弟弟 Vasya 很羡慕,决定自己也做一个 n n n 个整数的数组。

为此,他找到了 m m m 个整数 b i ( m ≥ n ) b_i ( m≥n ) bi(mn),现在他想从中选择一些 n n n 个整数并按一定的顺序排列,得到一个长度为 n n n 的数组 c i c_i ci

为了避免与哥哥的数组相似,瓦夏希望自己的数组与彼佳的数组尽可能不同。具体来说,他希望总差值 D = ∑ n i = 1 ∣ a i − c i ∣ D=∑ni=1|ai−ci| D=ni=1∣aici 越大越好。

帮助瓦夏找出他能得到的最大差值 D D D

输入
每个测试由多个测试用例组成。第一行包含一个整数 t ( 1 ≤ t ≤ 100 ) t ( 1≤t≤100 ) t(1t100) - 测试用例数。随后是测试用例的描述。

每个测试用例的第一行包含两个整数 n n n m ( 1 ≤ n ≤ m ≤ 2 ⋅ 1 0 5 ) m ( 1≤n≤m≤2⋅10^5 ) m(1nm2105)

每个测试用例的第二行包含 n n n 个整数 a i ( 1 ≤ a i ≤ 1 0 9 ) a_i ( 1≤a_i≤10^9 ) ai(1ai109)
每个测试用例的第三行包含 m m m 个整数 b i ( 1 ≤ b i ≤ 1 0 9 ) b_i ( 1≤b_i≤10^9 ) bi(1bi109)
保证在一个测试中,所有测试用例中 m m m 的总和不超过 2 ⋅ 1 0 5 2⋅10^5 2105

输出
对于每个测试用例,输出一个整数 - 可获得的最大总差值 D D D


特殊的贪心方式。

首先对于一个升序序列,距离 a i a_i ai 差值最大的一个元素是 a n − i + 1 a_{n - i + 1} ani+1,也就是往两边取。
那么对于当前两个数组也可以用类似的方法做,在此题中,就是距离 a i a_i ai 差值最大的元素有 b n − i + 1 , b m − i + 1 b_{n - i + 1},b_{m - i +1} bni+1bmi+1

CODE:

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;

void solve(){
    int n,m;cin >> n >> m;

    vector<int>a(n+1);
    vector<int>b(m+1);

    for(int i = 1;i <= n;i++)cin >> a[i];
    for(int j = 1;j <= m;j++)cin >> b[j];

    sort(a.begin() + 1,a.end());
    sort(b.begin() + 1,b.end());

    long long res = 0;

    for(int i = 1;i <= n;i++){
        res += max(abs(a[i] - b[n-i+1]),abs(a[i] - b[m-i+1]));
    }

    cout << res << endl;
}
int main(){
    int T;cin >> T;
    while(T--){
        solve();
    }
    return 0;
}
  • 25
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值