首页 > 其他分享 >【栈】2751. 机器人碰撞

【栈】2751. 机器人碰撞

时间:2024-06-09 18:32:09浏览次数:27  
标签:10 healths positions 机器人 碰撞 v1 2751 directions

本文涉及知识点

LeetCode2751. 机器人碰撞

现有 n 个机器人,编号从 1 开始,每个机器人包含在路线上的位置、健康度和移动方向。
给你下标从 0 开始的两个整数数组 positions、healths 和一个字符串 directions(directions[i] 为 ‘L’ 表示 向左 或 ‘R’ 表示 向右)。 positions 中的所有整数 互不相同 。
所有机器人以 相同速度 同时 沿给定方向在路线上移动。如果两个机器人移动到相同位置,则会发生 碰撞 。
如果两个机器人发生碰撞,则将 健康度较低 的机器人从路线中 移除 ,并且另一个机器人的健康度 减少 1 。幸存下来的机器人将会继续沿着与之前 相同 的方向前进。如果两个机器人的健康度相同,则将二者都从路线中移除。
请你确定全部碰撞后幸存下的所有机器人的 健康度 ,并按照原来机器人编号的顺序排列。即机器人 1 (如果幸存)的最终健康度,机器人 2 (如果幸存)的最终健康度等。 如果不存在幸存的机器人,则返回空数组。
在不再发生任何碰撞后,请你以数组形式,返回所有剩余机器人的健康度(按机器人输入中的编号顺序)。
注意:位置 positions 可能是乱序的。

示例 1:

在这里插入图片描述

输入:positions = [5,4,3,2,1], healths = [2,17,9,15,10], directions = “RRRRR”
输出:[2,17,9,15,10]
解释:在本例中不存在碰撞,因为所有机器人向同一方向移动。所以,从第一个机器人开始依序返回健康度,[2, 17, 9, 15, 10] 。
示例 2:
在这里插入图片描述

输入:positions = [3,5,2,6], healths = [10,10,15,12], directions = “RLRL”
输出:[14]
解释:本例中发生 2 次碰撞。首先,机器人 1 和机器人 2 将会碰撞,因为二者健康度相同,二者都将被从路线中移除。接下来,机器人 3 和机器人 4 将会发生碰撞,由于机器人 4 的健康度更小,则它会被移除,而机器人 3 的健康度变为 15 - 1 = 14 。仅剩机器人 3 ,所以返回 [14] 。
示例 3:

在这里插入图片描述

输入:positions = [1,2,5,6], healths = [10,10,11,11], directions = “RLRL”
输出:[]
解释:机器人 1 和机器人 2 将会碰撞,因为二者健康度相同,二者都将被从路线中移除。机器人 3 和机器人 4 将会碰撞,因为二者健康度相同,二者都将被从路线中移除。所以返回空数组 [] 。

提示:

1 <= positions.length == healths.length == directions.length == n <= 105
1 <= positions[i], healths[i] <= 109
directions[i] == ‘L’ 或 directions[i] == ‘R’
positions 中的所有值互不相同

向右的机器人入栈(下标、健康度),处理向左的机器人。
如果栈(用向量v1模拟,更简洁)为空,则将当前机器人,放到v2中,否则循环处理:
如果栈顶元素的健康度和当前机器人的健康度相等,出栈,循环结束。
如果小于 ⋯ \cdots ⋯ ,出栈,当前机器人健康减1。机器人,至少健康1,大于说明至少2,减少1后,至少1。
如果大于,栈顶机器人健康度减少1。循环结束。
对v1 和 v2合并并排序到v3。
复制v3的健康度到结果。
注意:不能用归并排序,因为i并不是升序,pos[i]才是升序。

代码

核心代码

class Solution {
public:
	vector<int> survivedRobotsHealths(vector<int>& positions, vector<int>& healths, string directions) {
		vector<int> indexs(positions.size());
		iota(indexs.begin(), indexs.end(), 0);
		sort(indexs.begin(), indexs.end(), [&](int i1, int i2) {return positions[i1] < positions[i2]; });
		vector<pair<int, int>> v1, v2;
		for (int i : indexs) {
			if ('R' == directions[i]) {
				v1.emplace_back(pair<int, int>{ i, healths[i] }); continue;
			}
			int hea = healths[i];
			while (v1.size() && (hea > 0)) {
				if (v1.back().second == hea) {
					v1.pop_back();
					hea = -1;
				}
				else if (v1.back().second <= hea)
				{
					v1.pop_back();
					hea--;
				}
				else {
					v1.back().second--;
					hea = -1;
				}
			}
			if (hea > 0) {
				v2.emplace_back(make_pair(i, hea));
			}
		}
		auto v3 = v1;
		v3.insert(v3.end(), v2.begin(), v2.end());
		sort(v3.begin(), v3.end());
		vector<int> ret;	
		for (const auto& [tmp, hea] : v3) {
			ret.emplace_back(hea);
		}
		return ret;
	}
};

单元测试

template<class T1,class T2>
void AssertEx(const T1& t1, const T2& t2)
{
	Assert::AreEqual(t1 , t2);
}

template<class T>
void AssertEx(const vector<T>& v1, const vector<T>& v2)
{
	Assert::AreEqual(v1.size(), v2.size());	
	for (int i = 0; i < v1.size(); i++)
	{
		Assert::AreEqual(v1[i], v2[i]);
	}
}

template<class T>
void AssertV2(vector<vector<T>> vv1, vector<vector<T>> vv2)
{
	sort(vv1.begin(), vv1.end());
	sort(vv2.begin(), vv2.end());
	Assert::AreEqual(vv1.size(), vv2.size());
	for (int i = 0; i < vv1.size(); i++)
	{
		AssertEx(vv1[i], vv2[i]);
	}
}

namespace UnitTest
{
	vector<int> positions;
	vector<int> healths;
	string directions;
	TEST_CLASS(UnitTest)
	{
	public:
		TEST_METHOD(TestMethod0)
		{
			positions = { 5,4,3,2,1 }, healths = { 2,17,9,15,10 }, directions = "RRRRR";
			auto res = Solution().survivedRobotsHealths(positions, healths, directions);
			AssertEx({ 2,17,9,15,10 },res);
		}
		TEST_METHOD(TestMethod00)
		{
			positions = { 5,4,3,2,1 }, healths = { 2,17,9,15,10 }, directions = "LLLLL";
			auto res = Solution().survivedRobotsHealths(positions, healths, directions);
			AssertEx({ 2,17,9,15,10 }, res);
		}
		TEST_METHOD(TestMethod1)
		{
			positions = { 3,5,2,6 }, healths = { 10,10,15,12 }, directions = "RLRL";
			auto res = Solution().survivedRobotsHealths(positions, healths, directions);
			AssertEx({14 }, res);
		}
		TEST_METHOD(TestMethod2)
		{
			positions = { 1,2,5,6 }, healths = { 10,10,11,11 }, directions = "RLRL";
			auto res = Solution().survivedRobotsHealths(positions, healths, directions);
			AssertEx({  }, res);
		}	
	};
}

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
《喜缺全书算法册》以原理、正确性证明、总结为主。
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

标签:10,healths,positions,机器人,碰撞,v1,2751,directions
From: https://blog.csdn.net/he_zhidan/article/details/139479009

相关文章

  • 【无人机控制】基于PID的四轮麦克纳姆移动机器人控制系统的研究与实现附matlab复现
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • 机器人位姿描述
    机器人的位姿描述与坐标变换是进行工业机器人运动学和动力学分析的基础。本节简要介绍上述内容,明确位姿描述和坐标变换的关系,用到的基本数学知识就是——矩阵。1位姿表示位姿代表位置和姿态。任何一个刚体在空间坐标系(OXYZ)中可以用位置和姿态来精确、唯一表示其位置状态。......
  • 【论文解读】针对机器人技术的大模型
    1、简要介绍 大型语言模型(LLM)经历了显著的发展,并越来越多地跨各个领域集成。值得注意的是,在机器人任务规划领域,LLM利用其先进的推理和语言理解能力,基于自然语言指令制定精确和高效的行动规划。然而,对于机器人与复杂环境交互的具体化任务,由于与机器人视觉感知缺乏......
  • Bug-QQ机器人
    ​Bug-QQ机器人基于YesRotgo-cqhttp,使用OneBot标准的插件感谢@Go-CQHTTP-YesBot项目,这个项目的大框架都是基于YesBot完成的。在YesBot上的修改修改群聊天方式,不需要@修改端口监听为websocket(原始方式在我的服务器上出现端口占用问题)加入一点新功能调整s......
  • 机器人足球-自动放球
    策略选择-这部分放在lua层-myball.luac++层的内容lua层--desc:Kicker_x=function() returnCOurRole_x("Kicker")endKicker_y=function() returnCOurRole_y("Kicker")endR_x=function() returnCOurRole_x("Receiver")endR_y=functi......
  • 钉钉机器人远程重启系统服务
    fromflaskimportFlask,requestimportsubprocessapp=Flask(__name__)@app.route('/send_message',methods=['GET'])defsend_message():webhook_url='https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN'#......
  • 【杂谈】AIGC之ChatGPT-与智能对话机器人的奇妙对话之旅
    与智能对话机器人的奇妙对话之旅引言在数字时代的浪潮中,ChatGPT如同一位智慧的旅伴,它不仅能够与我们畅谈古今,还能解答我们的疑惑,成为我们探索知识海洋的得力助手。今天,就让我们走进ChatGPT的世界,一探这位智能对话机器人的奥秘。起源:ChatGPT的诞生ChatGPT的诞生,可以追溯......
  • 六足机器人运动学
    文章目录前言六足机器人运动学分析1.正运动学2.逆运动学3.MATLAB验证正逆解代码前言六足机器人运动学六足机器人运动学分析六足机器人运动学分析就是将空间直角坐标系建立再机器人腿部的关节上将腿部各关节之间的间距,关节的夹角进行关系转换,求解其位置......
  • 第三届机器人、人工智能与信息工程国际学术会议(RAIIE 2024)
    【ACM独立出版/Fellow大咖云集】2024年第二届机器人、人工智能与信息工程国际学术会议(RAIIE2024)20243rdInternationalSymposiumonRobotics,ArtificialIntelligenceandInformationEngineering大会官网:https://ais.cn/u/juURra大会时间:2024年07月05-07日大会地点:新......
  • 自动移动机器人(AMR)技术详解
    自动移动机器人(AMR)技术是一种复杂的集成系统,它结合了多种技术来实现自主导航、感知环境和执行任务。以下是AMR技术的一些关键组件和功能:导航系统:定位技术:AMR通常使用GPS(在户外)和室内定位技术(如Wi-Fi、蓝牙、UWB或激光雷达SLAM)来确定其位置。路径规划:基于A*算法、Dijkstra......