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

D Very Different Array

题意

给出两个长度分别为n,m的数组a,cn<m,从c中选择n个数并找到一个序列使得D=ni=1|aici|尽可能大,求D的值

思路

假设如果mn一样大,那么找到这个序列的方法很简单:将两个序列分别排序后将其中一个转置,就可以使D尽可能大(可以用数学归纳法证明,第一步假设对k个数的序列转置后匹配可使D最大)。

m>n时,需要考虑的就是如何选择n个数字。将两个序列排序后,从前面的结论我们可以得出,如果要为a中的第一个数寻找对应的匹配数,那么必然是c中的最后一个数,同理要为a中的最后一个数寻找对应的匹配数,那么必然是c中的第一个数。因此我们只要对a中的第一和最后一个数的两个情况贪心地考虑哪一种情况的|aici|更优,然后就可以完成本题

主要代码

void solve()
{
    int n, m;
    cin >> n >> m;
    vector<int> a(n + 10), b(m + 10);
    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.begin() + 1 + n);
    sort(b.begin() + 1, b.begin() + 1 + m);
    int l = 1, r = m;
    int L = 1, R = n;
    ll  ans = 0;
    while (L <= R) {
        if (abs(a[L] - b[r]) > abs(a[R] - b[l])) {
            ans += abs(a[L] - b[r]);
            L++;
            r--;
        }
        else{
            ans += abs(a[R] - b[l]);
            R--;
            l++;
        }
    }
    cout << ans << "\n";
}
posted @   icey_z  阅读(177)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· dotnet 源代码生成器分析器入门
· 官方的 MCP C# SDK:csharp-sdk
· 一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
· 一步一步教你部署ktransformers,大内存单显卡用上Deepseek-R1
· 一次Java后端服务间歇性响应慢的问题排查记录
点击右上角即可分享
微信分享提示