傳送門
題意: 給定一個長度爲n的a數組, 和一個長度爲m的b數組, 每次可以選任意一個數組的任意一個元素, 讓它+ or - 1, 問最少執行多少步,可以使得a數組的最小值 >= b數組的最大值.
思路: 很明顯, 我們需要找到那個臨界值, 並且一定是處於一箇中間水平,太大或者太小都不行, 所以可以用三分處理, 然後統計答案就行, 詳情看代碼實現.
AC Code
const int maxn = 1e5+5;
int a[maxn], b[maxn];
int n, m;
ll qian[maxn], hou[maxn];
ll f(int x) {
ll t = 0;
for (int i = 1 ; i <= n ; ++ i) {
if (a[i] >= x) continue;
t += x - a[i];
}
for (int i = 1 ; i <= m ; ++ i) {
if (b[i] <= x) continue;
t += b[i] - x;
}
return t;
}
void solve() {
while(~scanf("%d%d", &n, &m)) {
int l = inf, r = -inf;
for (int i = 1 ; i <= n ; ++ i) {
scanf("%d", a+i);
l = min(l, a[i]);
}
for (int i = 1 ; i <= m ; ++ i) {
scanf("%d", b+i);
r = max(r, b[i]);
}
ll ans = 0;
while(l <= r) {
int len = (r - l) / 3;
int lm = l + len, rm = r - len;
ll flm = f(lm), frm = f(rm);
if (flm >= frm) {
ans = frm;
l = lm + 1;
}
else {
ans = flm;
r = rm - 1;
}
}
cout << ans << endl;
}
}