程式語言 - LeetCode - C++ - 3296. Minimum Number of Seconds to Make Mountain Height Zero



參考資訊:
https://algo.monster/liteproblems/3296

題目:


方法:

Step 1. workerTime * (1 + 2 + 3 + ... + n) = workerTime * n * (n + 1) / 2
Step 2. workerTime * n * (n + 1) / 2 <= timeLimit
Step 3. n^2 + n - 2 * timeLimit / workerTime <= 0
Step 4. n = (-1 + sqrt(1 + 8 * timeLimit / workerTime)) / 2



解答:

class Solution {
public:
    long long minNumberOfSeconds(int mountainHeight, vector<int>& workerTimes) {
        long l = 0;
        long r = LONG_MAX;

        auto complete = [&](long t) -> bool {
            long v = 0;

            for (auto& w : workerTimes) {
                v += static_cast<long>(sqrt(t * 2.0 / w + 0.25) - 0.5);
            }

            return v >= mountainHeight;
        };

        long ret = 0;
        while (l <= r) {
            long m = l + ((r - l) / 2);

            if (complete(m)) {
                ret = m;
                r = m - 1;
            }
            else {
                l = m + 1;
            }
        }

        return ret;
    }
};