洛谷 P10726 [GESP202406 八级] 空间跳跃 C++ 完整题解

ops/2025/2/21 8:02:08/

一、题目链接

P10726 [GESP202406 八级] 空间跳跃 - 洛谷

二、解题思路

我们要对输入的挡板进行排序,按高度从高到低(从小到大)。

排序之后s和t都要更新。

struct Baffle {int l, r;int h;int id;
} b[1005];void Sort() {sort(b + 1, b + 1 + n, cmp);for (int i = 1; i <= n; i++) {if (b[i].id == os)s = i;if (b[i].id == ot)t = i;}
}

对于每个挡板,我们都计算出跳到它左端的最小用时跳到它右端的最小用时,因为要想继续跳到另一个挡板上,必须先到达出发挡板的左端或者右端再往下跳。

如图,要想从A到B,只有从左侧下从右侧下两种方式。

那么,我们把到板块i左端点的最短时间记为dp[i][0]

同理,我们把到板块i右端点的最短时间记为dp[i][1]

根据上方规则,我们可以推断出:

// 从右跳下
dp[j][0] = min(dp[j][0], dp[i][1] + b[i].h - b[j].h + b[i].r - b[j].l);
dp[j][1] = min(dp[j][1], dp[i][1] + b[i].h - b[j].h + b[j].r - b[i].r);
// 道理同上
for (int i = s; i <= t; i++) {// 从左跳下for (int j = i + 1; j <= t; j++) {if (b[i].l >= b[j].l && b[i].l <= b[j].r && b[i].h > b[j].h) {if (j == t)ans = min(ans, dp[i][0] + b[i].h - b[j].h);dp[j][0] = min(dp[j][0], dp[i][0] + b[i].h - b[j].h + b[i].l - b[j].l);dp[j][1] = min(dp[j][1], dp[i][0] + b[i].h - b[j].h + b[j].r - b[i].l);break;}}// 从右跳下for (int j = i + 1; j <= t; j++) {if (b[i].r >= b[j].l && b[i].r <= b[j].r && b[i].h > b[j].h) {if (j == t)ans = min(ans, dp[i][1] + b[i].h - b[j].h);dp[j][0] = min(dp[j][0], dp[i][1] + b[i].h - b[j].h + b[i].r - b[j].l);dp[j][1] = min(dp[j][1], dp[i][1] + b[i].h - b[j].h + b[j].r - b[i].r);break;}}}

三、完整代码

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;struct Baffle {int l, r;int h;int id;
} b[1005];int n, s, t,os,ot;bool cmp(const Baffle& a, const Baffle& b) {if(a.h != b.h)return a.h > b.h;return a.l < b.l;
}void Sort() {sort(b + 1, b + 1 + n, cmp);for (int i = 1; i <= n; i++) {if (b[i].id == os)s = i;if (b[i].id == ot)t = i;}
}int main() {cin >> n >> os >> ot;for (int i = 1; i <= n; i++)cin >> b[i].l >> b[i].r >> b[i].h, b[i].id = i;Sort();int dp[1005][2], ans = 0x3f3f3f3f;memset(dp, 0x3f, sizeof (dp));dp[s][0] = 0, dp[s][1] = b[s].r - b[s].l;for (int i = s; i <= t; i++) {// 从左跳下for (int j = i + 1; j <= t; j++) {if (b[i].l >= b[j].l && b[i].l <= b[j].r && b[i].h > b[j].h) {if (j == t)ans = min(ans, dp[i][0] + b[i].h - b[j].h);dp[j][0] = min(dp[j][0], dp[i][0] + b[i].h - b[j].h + b[i].l - b[j].l);dp[j][1] = min(dp[j][1], dp[i][0] + b[i].h - b[j].h + b[j].r - b[i].l);break;}}// 从右跳下for (int j = i + 1; j <= t; j++) {if (b[i].r >= b[j].l && b[i].r <= b[j].r && b[i].h > b[j].h) {if (j == t)ans = min(ans, dp[i][1] + b[i].h - b[j].h);dp[j][0] = min(dp[j][0], dp[i][1] + b[i].h - b[j].h + b[i].r - b[j].l);dp[j][1] = min(dp[j][1], dp[i][1] + b[i].h - b[j].h + b[j].r - b[i].r);break;}}}cout << (ans == 0x3f3f3f3f ? -1 : ans) << endl;return 0;
}


http://www.ppmy.cn/ops/160188.html

相关文章

本地部署MindSearch(开源 AI 搜索引擎框架),然后上传到 hugging face的Spaces——L2G6

部署MindSearch到 hugging face Spaces上——L2G6 任务1 在 官方的MindSearch页面 复制Spaces应用到自己的Spaces下&#xff0c;Space 名称中需要包含 MindSearch 关键词&#xff0c;请在必要的步骤以及成功的对话测试结果当中 实现过程如下&#xff1a; 2.1 MindSearch 简…

qt:常见标签操作,倒计时功能,进度条与日历

1.标签常见函数 函数功能void setext(const QString &text)设置文本QString text()const获取文本void setPixmap(const QPixmap)与Pixmap()const设置和获取图像void setAlignment(Qt::Alignment alignment)设置对齐&#xff08;获取和上面一样&#xff09;void setWordWr…

DeepSeek+kimi自动生成ppt

AI自动生成ppt 描述需求&#xff0c;生成大纲 在deepseek里输入需求&#xff0c;https://chat.deepseek.com/&#xff0c; 或者在其它AI搜索里&#xff0c;如kimi中Kimi.ai - 会推理解析&#xff0c;能深度思考的AI助手 搜索后会得到大纲&#xff0c;复制出来。 打开KIMI …

【HarmonyOS Next】鸿蒙监听手机按键

【HarmonyOS Next】鸿蒙监听手机按键 一、前言 应用开发中我们会遇到监听用户实体按键&#xff0c;或者扩展按键的需求。亦或者是在某些场景下&#xff0c;禁止用户按下某些按键的业务需求。 这两种需求&#xff0c;鸿蒙都提供了对应的监听事件进行处理。 onKeyEvent 默认的…

当滑动组件连续触发回调函数的三种解决办法

1. 节流&#xff08;Throttle&#xff09; 节流是一种限制函数调用频率的技术&#xff0c;它会在一定时间内只允许函数执行一次。在滑动组件中使用节流可以避免短时间内的连续触发。 Entry Component struct ThrottleSlideExample {// 节流时间间隔&#xff0c;单位为毫秒pri…

Git安装

一、下载安装包 连接 二、详细安装 三、环境配置 1. 设置 Git 全局用户名和邮箱 git config --global user.name "gitxiewei" git config --global user.email "returnxw163.com" 2. 验证配置 git config --global --list 3. 设置别名 在4在文件夹中找…

推荐一个github star45k+进阶的java项目及知识的网站

mall是github上star 45k的一个java项目 mall项目是一套电商系统&#xff0c;包括前台商城系统及后台管理系统&#xff0c;基于SpringBootMyBatis实现&#xff0c;采用Docker容器化部署。 前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心…

C/C++面试知识点总结

目录 1. 指针1.1 智能指针1.2 指针和引用的区别1.3 数组和指针的区别1.4 数组指针和指针数组的区别1.5 迭代器和指针的区别1.6 strcpy 和 memcpy 的区别 2. 内存管理与分配2.1 内存分配与存储区2.2 malloc / free2.3 volatile和extern的区别2.4 拷贝构造函数2.5 预处理、编译、…