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

2024-04-28 11:52

本文主要是介绍2398.预算内最多的机器人数目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我第一个手搓的hard的单调队列题目......灵神yyds

思路解析:

        我做的时候感觉这个题目有点歧义,我以为他的连续运行是时间上连续,所以我开始写的代码是选择最多的子序列(可以不连续),使得不超过budget,这个求最多子序列的代码会在最后给出,不保证完全正确(因为没有太多测试点),但是逻辑上是没问题的,可以作为思路看看.

        下面说说这个 要求连续的子序列 的个数最大值怎么求解

        首先数据量5*1e4最多是O(nlogn)

        注意到每次right(子序列的右边界)加一之后,左边界都可能不变或者回缩,所以我们可以使用滑动窗口的思想,那么因为max(chargeTimes)比较难求,耗时较长,所以我们可以使用单调队列来维护最大值,来实现O(1)时间内取出当前最大chargeTimes, (by the way, 我们也可以使用稀疏表来实现O(1),但是建表的过程是O(nlogn)的,不如单调队列,感兴趣的童鞋可以试试), 而对于sum(runningCosts),我们只需要一个sums记录一下即可,至于数目,我们可以使用一个cur表示当前的数量,使用ans=max(ans,cur)更新即可.

        下面具体说一说单调队列的维护:

        首先我们需要让单调队列来维护当前的最大值,也就是遇到比队尾小的直接加入,遇到比队尾大的,把队尾弹出再加入. 至于相等的元素可以直接加入,也可以把和它相等的元素都弹出去之后,再加入.这是因为我们不关注最大值的个数,只关注最大值,就算当前队列里面最大值的个数不对,但是他依然能够成功维护当前窗口最大值,这是因为我们当前的窗口是 [left, i],只有left等于dq.front()才会pop_front().

        之后我们判断当前区间的[left, i]是否再预算里面, yes-> 更新ans,  no->说明左边界要右移,但是我们每轮循环至多只用移动一位(因为 i 每次也只是加一),再更新sum,如果left等于dq.front(),那么说明当前front不能用了,pop_front.           

        by the way,这也是单调队列的第二种模板,也即使用left和i表示当前区间,利用滑动窗口的特点,每次左边界不变或者收缩,不变的时候更新ans,收缩的时候判断当前队头还能不能使用

代码如下

class Solution {
public: int maximumRobots(vector<int>& chargeTimes, vector<int>& runningCosts, long long budget) {int len=chargeTimes.size();deque<int> dq;int ans=0,left=0; long long sum=0;for(int i=0;i<len;i++){while(dq.size() && chargeTimes[i]>=chargeTimes[dq.back()]){dq.pop_back();}dq.push_back(i);sum+=runningCosts[i];if(chargeTimes[dq.front()]+(i-left+1)*sum <= budget){ans=max(ans,i-left+1);}else{ sum-=runningCosts[left];if(left==dq.front()) dq.pop_front();left++;}}return ans;}
};

        那么如果我们要求的是 不连续的最长子序列呢, 那么首先我们需要按照runningcosts来做一个升序排序,这样我们如果想要得到更长的子序列,就需要pop出去当前chargeTimes最大的元素,这样才有可能得到一个更长的序列,代码如下:

        而且注意这个时候在单调队列中,新元素如果和队尾相等,那么就应该加入进去,而不能pop_back()掉相等的元素了,因为这个时候用的就不是[left, i]的模板了,就没有if(left==dq.front())来保障最大值的安全了,每次不满足条件我们都是pop_front(),所以最大值的个数同样重要

class Solution {
public: 
//我现在的这个做法是求的是不连续的最大int maximumRobots(vector<int>& chargeTimes, vector<int>& runningCosts, long long budget) {int len=chargeTimes.size();vector<int> index;for(int i=0;i<len;i++) index.push_back(i);sort(index.begin(),index.end(),[&](const int a,const int b){if(runningCosts[a]!=runningCosts[b]) return runningCosts[a]<runningCosts[b];else return chargeTimes[a]<chargeTimes[b];});deque<int> dq;int ans=0,cur=0; long long sum=0;for(int i=0;i<len;i++){int idx=index[i];while(dq.size() && chargeTimes[idx]>chargeTimes[dq.back()]){dq.pop_back();}dq.push_back(idx);sum+=runningCosts[idx];if(chargeTimes[dq.front()]+(cur+1)*sum < budget){cur++;ans=max(ans,cur);}else{//sum-=runningCosts[dq.front()];dq.pop_front();cur--;}}return ans;}
};

这篇关于2398.预算内最多的机器人数目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/943199

相关文章

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

POJ 2318 几何 POJ 2398

给出0 , 1 , 2 ... n 个盒子, 和m个点, 统计每个盒子里面的点的个数。 const double eps = 1e-10 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;}struct Point{double x , y

基于树梅派的视频监控机器人Verybot

最近这段时间做了一个基于树梅派 ( raspberry pi ) 的视频监控机器人平台 Verybot ,现在打算把这个机器人的一些图片、视频、设计思路进行公开,并且希望跟大家一起研究相关的各种问题,下面是两张机器人的照片:         图片1:                   图片2                    这个平台的基本组成是:

【机器人工具箱Robotics Toolbox开发笔记(二十)】机器人工具箱SerialLink I类函数参数说明

机器人工具箱中的SerialLink表示串联机器人型机器人的具体类。该类使用D-H参数描述,每个关节一组。SerialLink I类包含的参数如表1所示。 表1 SerialLink I类参数 参  数 意    义 参  数 意    义 plot 显示机器人的图形表示 jacobn 工具坐标系中的雅可比矩阵 plot3D 显示机器人3D图形模型 Jacob_dot

机器人助力上下料搬运,加速仓库转运自动化

近年来,国内制造业领域掀起了一股智能化改造的浪潮,众多工厂纷纷采纳富唯智能提供的先进物流解决方案,这一举措显著优化了生产流程,实现了生产效率的飞跃式增长。得益于这些成功案例,某信息技术服务企业在工厂智能物流建设的进程中,也选择了与富唯智能合作。 为了应对日益增长的物料搬运需求,匹配成品输出节拍,该公司引入了富唯智能复合机器人AMR与搬运机器人AGV,实现了仓库成品搬运自动化,大幅减少人工

【最新华为OD机试E卷-支持在线评测】机器人活动区域(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线评测,专栏文章质量平均 94 分 最新华为OD机试目录: https://blog.

Dify.ai:部署自己的 AI 应用、知识库机器人,简单易用

Dify.ai:部署自己的 AI 应用、知识库机器人,简单易用 今天,来分享下 Dify.AI 这个产品,一句话介绍:可供普通人简单易用的部署生成出一个 AI 应用。这是一种使用人工智能技术来帮助团队开发和运营 AI 应用的工具。 什么是 Dify.ai Dify.ai 是一个易于使用的 LLMOps 平台,旨在帮助更多的人创建可持续的、AI 原生的应用。通过对各种应用类型的可视化编排,Di

机器人可能会在月球上提供帮助

登月是我们这个时代最具标志性的事件之一,这可能还算轻描淡写了:这是我们迄今为止在物理上探索得最远的一次。我听过一些当时的老广播,它们可以让你想象出这次航行的重要性。 现在,研究人员表示,我们可能很快就能重返月球,甚至可能很快就会有人类任务前往火星。 火星。艺术家:NASA 这次会有什么不同呢? 有一点是确定的:机器人将大力协助—— 非常多。 在麻省理工学院,我们的一些团队正在开发突破性的

【人工智能/机器学习/机器人】数学基础-学习笔记

函数 奇偶性: 偶函数: f ( − x ) = f ( x ) f(-x)=f(x) f(−x)=f(x)     y轴对称 f ( x ) = x 2 f(x)=x^2 f(x)=x2     f ( − x ) = ( − x ) 2 = x 2 = f ( x ) f(-x)=(-x)^2=x^2=f(x) f(−x)=(−x)2=x2=f(x) 奇函数: f ( − x )