原题链接
HINT 1:
给定升序数组 \(a,b\),已知 \(b_i \geq a_i\) , 请任意排列 \(a,b\) 使得
- \(b_i \geq a_i\) 对所有 \(i\) 都成立
- 最大化 \(\min(b_i-a_i)\)
请问该如何排列?
答案是就让 \(a,b\) 升序排列,举反例可以任意交换两个 \(b_i,b_j\) 验证
HINT 2:
假设我们已知最优配对和最优值 \(k\),那么一定存在 \(t\) 个小配对使得 \(a_i+k \leq b_i\),\(n-t\) 个大配对使得 \(a_i-k \geq b_i\)
- 对于小配对,为了最优,一定是最小的 \(t\) 个 \(a_i\) 去配对最大的 \(t\) 个 \(b_i\)
- 对于大配对,为了最优,一定是最大的 \(n-t\) 个 \(a_i\) 去配对最小的 \(n-t\) 个 \(b_i\)
题解
根据上述提示,我们遍历所有的 \(t\) 即可
code
#include<bits/stdc++.h>
using namespace std;#define ll long longll 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;
}