B. Charming Meals

原题链接

HINT 1:

给定升序数组 a,b,已知 biai , 请任意排列 a,b 使得

  • biai 对所有 i 都成立
  • 最大化 min(biai)

请问该如何排列?
答案是就让 a,b 升序排列,举反例可以任意交换两个 bi,bj 验证

HINT 2:

假设我们已知最优配对和最优值 k,那么一定存在 t 个小配对使得 ai+kbint 个大配对使得 aikbi

  • 对于小配对,为了最优,一定是最小的 tai 去配对最大的 tbi
  • 对于大配对,为了最优,一定是最大的 ntai 去配对最小的 ntbi

题解

根据上述提示,我们遍历所有的 t 即可

code

#include<bits/stdc++.h>
using namespace std;

#define ll long long

ll a[5005], b[5005];

int main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    ll t;
    cin >> t;
    while (t--)
    {
        ll n;
        cin >> n;
        for (ll i = 1; i <= n; i++) cin >> a[i];
        for (ll i = 1; i <= n; i++) cin >> b[i];

        sort(a + 1, a + 1 + n);
        sort(b + 1, b + 1 + n);

        ll ans = 0;
        for (ll len = 0; len <= n; len++) // 有len个小配对
        {
            ll flag = 1;
            ll val = 2e15;
            for (ll i = 1; i <= len; i++)
            {
                if (a[i] > b[n - len + i]) flag = 0;
                else val = min(val, b[n - len + i] - a[i]);
            }
            for (ll i = 1; i <= n - len; i++)
            {
                if (b[i] > a[i + len]) flag = 0;
                else val = min(val, a[i + len] - b[i]);
            }
            if (flag) ans = max(ans, val);
        }

        cout << ans << '\n';
    }
    return 0;
}

posted @   纯粹的  阅读(32)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示