classSolution: defmaximumRobots(self, chargeTimes: List[int], runningCosts: List[int], budget: int) -> int: ans = s = left = 0 q = deque() # 枚举区间右端点 right,计算区间左端点 left 的最小值 for right, (t, c) inenumerate(zip(chargeTimes, runningCosts)): # 及时清除队列中的无用数据,保证队列的单调性 while q and t >= chargeTimes[q[-1]]: q.pop() q.append(right) s += c # 如果左端点 left 不满足要求,就不断右移 left while q and chargeTimes[q[0]] + (right - left + 1) * s > budget: # 及时清除队列中的无用数据,保证队列的单调性 if q[0] == left: q.popleft() s -= runningCosts[left] left += 1 ans = max(ans, right - left + 1) return ans
classSolution { publicintmaximumRobots(int[] chargeTimes, int[] runningCosts, long budget) { varans=0; varq=newArrayDeque<Integer>(); varsum=0L; // 枚举区间右端点 right,计算区间左端点 left 的最小值 for (intleft=0, right = 0; right < chargeTimes.length; ++right) { // 及时清除队列中的无用数据,保证队列的单调性 while (!q.isEmpty() && chargeTimes[right] >= chargeTimes[q.peekLast()]) q.pollLast(); q.addLast(right); sum += runningCosts[right]; // 如果左端点 left 不满足要求,就不断右移 left while (!q.isEmpty() && chargeTimes[q.peekFirst()] + (right - left + 1) * sum > budget) { // 及时清除队列中的无用数据,保证队列的单调性 if (q.peekFirst() == left) q.pollFirst(); sum -= runningCosts[left++]; } ans = Math.max(ans, right - left + 1); } return ans; } }
classSolution { public: intmaximumRobots(vector<int> &chargeTimes, vector<int> &runningCosts, longlong budget){ int ans = 0; deque<int> q; long sum = 0L; // 枚举区间右端点 right,计算区间左端点 left 的最小值 for (int left = 0, right = 0; right < chargeTimes.size(); ++right) { // 及时清除队列中的无用数据,保证队列的单调性 while (!q.empty() && chargeTimes[right] >= chargeTimes[q.back()]) q.pop_back(); q.push_back(right); sum += runningCosts[right]; // 如果左端点 left 不满足要求,就不断右移 left while (!q.empty() && chargeTimes[q.front()] + (right - left + 1) * sum > budget) { // 及时清除队列中的无用数据,保证队列的单调性 if (q.front() == left) q.pop_front(); sum -= runningCosts[left++]; } ans = max(ans, right - left + 1); } return ans; } };
classSolution: defmaximumRobotsSubseq(self, chargeTimes: List[int], runningCosts: List[int], budget: int) -> int: ans = sum_cost = 0 h = [] # 最大堆,堆顶表示当前的最大花费,从而贪心地在不满足要求的情况下,优先去掉最大的花费 for t, c insorted(zip(chargeTimes, runningCosts)): # 按照时间排序,从而保证当前的时间是最大的,在此之前的机器人都是可以选的 heappush(h, -c) sum_cost += c while h and t + len(h) * sum_cost > budget: sum_cost += heappop(h) # 弹出一个最大花费,即使弹出的是当前的 c 也没关系,这不会得到更大的 ans ans = max(ans, len(h)) return ans