当前位置: 首页 > article >正文

2398. 预算内的最多机器人数目(24.9.13)

题目

n个机器人,给定两个下标从 0 开始的整数数组chargeTimesrunningCosts,两者长度都为(n)。第(i)个机器人充电时间为chargeTimes[i]单位时间,花费runningCosts[i]单位时间运行。另外还有一个整数budget

运行(k)个机器人总开销是max(chargeTimes) + k * sum(runningCosts),其中(\text{max(chargeTimes)})是这(k)个机器人中最大充电时间,sum(runningCosts)是这k个机器人的运行时间之和。

要求返回在不超过budget的前提下,最多可以连续运行的机器人数目。

示例 1

  • 输入:chargeTimes=[3,6,1,3,4]runningCosts =[2,1,3,4,5]budget=25
  • 输出:3。
  • 解释:可以在 budget 以内运行所有单个机器人或者连续运行 2 个机器人。选择前 3 个机器人,可以得到答案最大值 3。总开销是(\text{max(3,6,1)}+3\times\text{sum(2,1,3)} = 6 + 3\times6 = 24),小于 25。可以看出无法在 budget 以内连续运行超过 3 个机器人,所以返回 3。

示例 2

  • 输入:chargeTimes=[11,12,19]runningCosts=[10,8,7]budget=19
  • 输出:0。
  • 解释:即使运行任何一个单个机器人,还是会超出 budget,所以返回 0。

提示

  • chargeTimes.length = runningCosts.length == n
  • 1 <= n <= 5 * 10^4
  • 1 <= chargeTimes[i], runningCosts[i] <= 10^5
  • 1 <= budget <= 10^15

解题思路

见代码

代码

class Solution {
public:
    int maximumRobots(vector<int>& chargeTimes, vector<int>& runningCosts, long long budget) {
        int n=chargeTimes.size();
        int ans=0;
        long long sum=0;//用于记录sum(runningCosts)
        int l;
        deque<int> q;//利用双端队列来 保持max(chargeTimes)
        for(int r=0;r<n;r++){
            //入
            while(!q.empty()&&chargeTimes[q.back()]<=chargeTimes[r]){
                q.pop_back();
            }
            q.push_back(r);
            sum+=runningCosts[r];
            //出
            while(!q.empty()&&chargeTimes[q.front()]+(r-l+1)*sum>budget){
                if(q.front()==l){
                    //当其等于滑动窗口的左端点时说明将会滑出窗口
                    q.pop_front();
                }
                sum-=runningCosts[l++];
                //更新窗口,将左端点想右方移动,用于减少
                //用来保持 chargeTimes[q.front()]+(r-l+1)*sum <= budget
            }
            //更新答案
            ans=max(ans,r-l+1);
        }
        return ans;
    }
};

http://www.kler.cn/news/303773.html

相关文章:

  • 【论文笔记】AutoLFADS (Nature Methods, 2022)
  • 深度学习的笔记
  • vue的自定义指令
  • 连年(年份)
  • 再次进阶 舞台王者 第八季完美童模全球赛代言人【肖牧辰】赛场+秀场超燃合集!
  • C51单片机-单按键输入识别,键盘消抖
  • 【原创教程】电气电工18:三大品牌的IO_LINK
  • Leetcode 每日一题:Count Complete Tree Nodes
  • webpack打包原理
  • QT 串口上位机读卡显示
  • DMA与AXI DMA ip
  • PMP–一、二、三模–分类–14.敏捷–技巧–敏捷团队通才型专家
  • Golang数据流处理:掌握Reader和Writer接口的技巧
  • 信息系统容灾等级
  • 【docker】docker network 网络
  • C++数据结构
  • STM32 HAL freertos零基础(九)任务通知
  • 【Python深度学习】逆强化学习(IRL):通俗揭开学习背后的奥秘
  • vue devtools的使用
  • 外包干了3天,技术退步明显.......
  • Apache DataFusion查询引擎简介
  • 0to1使用Redis实现“登录验证”次数限制
  • 【面试题】什么是代理以及如何实现代理
  • shader 案例学习笔记之将坐标系分成4个象限
  • JVM面试真题总结(八)
  • 浅谈WebApi
  • 低压电抗器与电容器安装距离
  • 爆改YOLOv8|利用yolov9的ADown改进卷积Conv-轻量化
  • MySQL--数据库基础
  • 【iOS】——应用启动流程