LC 2141. 同时运行 N 台电脑的最长时间

https://leetcode-cn.com/problems/maximum-running-time-of-n-computers/

大概猜想到是二分查找,但总是觉得有某些情况没有考虑到:一个电池在中途挪去到另外一个地方充电,这个问题怎么解决呢?

其实这个放置如果画出来的话,可能就容易理解了。比如这个 链接 里面给出的图片

Pasted-Image-20231225103706.png

这样的话代码就很好写了。

class Solution:
    def maxRunTime(self, n: int, batteries: List[int]) -> int:
        batteries.sort(reverse = True)

        def check(k):
            tt = 0
            for x in batteries:
                tt += min(x, k)
            return tt >= n * k

        s, e = 0, sum(batteries)
        while s <= e:
            m = (s + e) // 2
            if check(m):
                s = m + 1
            else:
                e = m - 1
        return e

然后第一名还有个更好的方案,其实也可以通过上面这个图片推导过来:

class Solution:
    def maxRunTime(self, n: int, batteries: List[int]) -> int:
        batteries.sort(reverse = True)

        tt = sum(batteries)
        avg = 0
        for x in batteries:
            avg = tt // n
            if x > avg:
                n -= 1
                tt -= x
            else:
                break

        return avg

一旦画出上面这幅图,从另外一个视角来分析问题,有时候问题就会迎刃而解。而能否画出这幅图,则要看是否有着深入的insight, 这就是水平了。