C. Mixing Water

_Yxc發表於2024-05-01

https://codeforces.com/contest/1359/problem/C

題意:給h和c兩個數,並且操作順序必須是hchchchch...對這些操作求和後除以操作次數得到均值,要求這個均值儘可能的接近t。問在最接近t的情況下,最少需要進行多少次操作。

思路:如果(h + c) / 2 >= t,那麼則只需兩次操作最優。 如果h == t,那麼一次操作最優。對於其他的情況,可以假設hc這樣的操作有k次,可以得到公式k = (t - h) / (h + c - 2 * t).k是一個浮點數,那麼再討論一下k向上或者向下取整的情況,取一個最優的即可。

總結:一開始誤解了題意,以為題目要求任意順序,只要最後的值最接近t就行。後來發現有順序要求,那麼就分三種情況討論。對於第三種情況,沒有考慮到設一個k,然後求k即可。
如果不要求操作順序的話,那麼設一個未知數k是無效的,需要兩個未知數x和y來表示,那麼不能O(1)求x和y,可能需要列舉x和y的數量,根據一個x,可以求出固定的y?

void solve(){
    double h, c, t;
    cin >> h >> c >> t;

    if (t == h){
        cout << 1 << "\n";
    }
    else if ((h + c) >= t * 2){
        cout << 2 << "\n";
    }
    else{
        double k = (t - h) / (h + c - 2 * t);
        double error1 = abs((ceil(k) * (h + c) + h) / (ceil(k) * 2 + 1) - t);
        double error2 = abs((floor(k) * (h + c) + h) / (floor(k) * 2 + 1) - t);
        cout << (error2 <= error1 ? (2 * floor(k) + 1) : (2 * ceil(k) + 1)) << "\n";
    }
}

相關文章