ABC374 E 題解

DengStar發表於2024-10-06

ABC374 E 題解

E - Sensor Optimization Dilemma 2

題目連結:AT | 洛谷

容易發現答案可以二分。於是我們把問題轉化為了判定性問題:給定目標 \(x\),能否在花費不超過預算的情況下,使得每個過程的產量都不低於 \(x\)

進一步,由於各個過程的生產互不相關,所以我們要儘可能讓每個過程的費用盡可能小,這樣一定是最優的。對於每個過程分別考慮,就是要問:

給定兩種機器,第一種機器的產量為 \(a\),價格為 \(p\);第二種機器的產量為 \(b\),價格為 \(q\)。要使總產量達到 \(x\),如何讓花費盡可能少?

(其實我從這裡開始就想不出來了)

一種顯然的暴力是列舉某一種機器的數量——例如第一種,從 \(0\) 列舉到 \(\left\lceil \dfrac{x}{a} \right\rceil\),同時可以 \(O(1)\) 計算出所需的第二種機器的數量。這樣算出的答案顯然一定正確,但列舉的次數是 \(O(x/a)\),當 \(x\) 很大且 \(a\) 很小時,無法接受。

想到正解或許需要一點靈感。考慮這個事實:如果要生產 \(ab\) 個零件,有兩種方案:購買 \(b\) 個第一種機器,花費 \(bp\);或 \(a\) 個第二種機器,花費 \(aq\)。可能還有別的方案,但可以別的證明一定不會更優。(從“價效比”的角度來考慮。)

從這個事實,可以推出:在最優方案中,兩種機器的產量不可能同時達到 \(ab\)如果兩種機器的產量都達到了 \(ab\),總可以把較貴的 \(ab\) 產量交換給另一種機器,使得費用更低。因此,以下兩種情況不可能同時發生:

  1. 第一種機器的數量達到 \(b\)
  2. 第二種機器的數量達到 \(a\)

這實際上就是“兩種機器的產量不可能同時達到 \(ab\)”的另一種表述方法。

有了這個結論之後,就可以分別列舉兩種機器的數量:第一種機器從 \(0\) 列舉到 \(b - 1\),第二種機器從 \(0\) 列舉到 \(a - 1\)。根據上述結論,這樣就可以保證列舉到最優策略。設 \(a\)\(b\) 的值域為 \(V\),我們就在 \(O(\log(XV)NV)\) 的時間內透過了此題。

參考程式碼:

auto check = [&](const i64 x) -> bool
{
    i64 tot = 0;
    for(int i = 0; i < n; i++)
    {
        i64 a = A[i], b = B[i], p = P[i], q = Q[i], xx = x, add = 0x3f3f3f3f3f3f3f3f;

        for(int j = 0; j < b; j++)
        {
            i64 tmp = j * p + ceil(max(0ll, xx - j * a), b) * q;
            add = min(add, tmp);
        }
        for(int j = 0; j < a; j++)
        {
            i64 tmp = j * q + ceil(max(0ll, xx - j * b), a) * p;
            add = min(add, tmp);
        }

        tot += add;
        if(tot > lim) return false;
    }
    return true;
};

int L = 0, R = 1e9, ans = -1;
while(L <= R)
{
    int mid = (L + R) >> 1;
    if(check(mid)) L = mid + 1, ans = mid;
    else R = mid - 1;
}

提交記錄