#54670: C++解法


william000000000 (unknown)


#include <iostream>

 

using namespace std;

 

// 寫一個輔助函數:根據目前的總水量,算出對應的水位高度

int getHeight(int vol, int w1, int h1, int w2, int h2) {

    int v1 = w1 * w1 * h1;

    int v2 = w2 * w2 * h2;

    

    if (vol <= 0) return 0;

    // 如果水量超過總容量,高度就是兩個容器的高度和

    if (vol >= v1 + v2) return h1 + h2;

    

    // 如果水量還在下層容器

    if (vol <= v1) {

        return vol / (w1 * w1);

    } 

    // 如果水量已經超過下層,進入上層容器

    else {

        return h1 + (vol - v1) / (w2 * w2);

    }

}

 

int main() {

    int n, w1, w2, h1, h2;

    if (!(cin >> n >> w1 >> w2 >> h1 >> h2)) return 0;

    

    int v1 = w1 * w1 * h1;

    int v2 = w2 * w2 * h2;

    int max_capacity = v1 + v2;

    

    int current_volume = 0;

    int max_differ = 0;

    

    for (int i = 0; i < n; i++) {

        int pour;

        cin >> pour;

        

        // 如果水已經滿了,後面的倒水都不會增加高度

        if (current_volume >= max_capacity) {

            continue; 

        }

        

        // 1. 倒水前的高度

        int old_h = getHeight(current_volume, w1, h1, w2, h2);

        

        // 2. 更新總水量 (注意不能超過最大容量)

        current_volume += pour;

        if (current_volume > max_capacity) {

            current_volume = max_capacity;

        }

        

        // 3. 倒水後的高度

        int new_h = getHeight(current_volume, w1, h1, w2, h2);

        

        // 4. 計算高度差並更新最大值

        int differ = new_h - old_h;

        if (differ > max_differ) {

            max_differ = differ;

        }

   

 }

    

    cout << max_differ << "\n";

    

    return 0;

}