Codeforces #251 D題 Devu and his Brother 【三分】

傳送門
題意: 給定一個長度爲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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章