luogu#P11586. [KTSC 2022 R1] 松鼠
[KTSC 2022 R1] 松鼠
题目背景
请使用 C++17 或 C++20 提交本题
你需要在程序开头加入如下代码:
#include <vector>
long long fly(std::vector<int> D, std::vector<int> H, std::vector<int> W, int L, int R);
题目译自 2022년도 국제정보올림피아드 대표학생 선발고사 - 1차 선발고사 T4「 날다람쥐 」
题目描述
在二维平面上,有 根柱子按顺序排列。柱子从左到右编号为 到 。第 根柱子的底部位于点 ,高度为 。因此,这根柱子是连接点 和 的线段。此外,。
一开始,松鼠位于最左边柱子的高度为 的位置,即点 。松鼠需要依次经过所有柱子,最终到达最右边柱子的高度为 的位置,即点 。
当松鼠从一根柱子飞到下一根柱子时,如果向右移动 ,高度会下降 。在到达下一根柱子之前,松鼠不能碰到地面。到达下一根柱子的高度为 的位置是允许的。
松鼠可以在一根柱子上向上爬或向下滑,但不能爬到超过柱子高度的位置。在第 根柱子上向上爬 需要花费 的费用。向下滑动不需要费用。
下图是飞天松鼠移动的一个例子。
下图左侧的移动方式由于中途碰到地面,因此不允许。下图右侧的移动方式由于没有经过所有柱子,也不允许。
请计算松鼠以最小总费用到达目标位置的方法。
你需要实现以下函数:
long long fly(vector<int> D, vector<int> H, vector<int> W, int L, int R);
- 该函数只会被调用一次。
- 给定的三个数组的大小为柱子的数量 。
- 给定的整数数组 中, 表示第 根柱子到第 根柱子的距离 。
- 给定的整数数组 中, 表示第 根柱子的高度 。
- 给定的整数数组 中, 表示第 根柱子上每上升 单位距离的费用 。
- 给定的整数 表示飞天松鼠在第 根柱子上的初始高度。
- 给定的整数 表示飞天松鼠在第 根柱子上需要到达的高度。
该函数的返回值应为:
- 如果有方法遵守规则到达最终位置,返回飞天松鼠到达最终位置的最小费用。可以证明,满足约束条件的输入数据的最小费用总是整数。
- 如果没有方法遵守规则到达最终位置,返回
-1
。
注意,提交的代码中不应包含任何输入输出操作。
输入格式
示例评测程序按以下格式读取输入:
- 第 行:
- 第 行:
- 第 行:
输出格式
示例评测程序按以下格式输出:
第 行:函数 fly
返回的值。
3
0 8 3
2 5 4
5 5 6
5 4
18
3
0 4 6
3 2 5
5 6 3
1 5
37
提示
样例解释 #1
考虑 ,第 根柱子到第 根柱子的距离为 ,第 根柱子到第 根柱子的距离为 ,柱子的高度从左到右分别为 ,柱子的权重从左到右分别为 , 的情况。
评测程序将调用如下函数:
fly([0,2,5],[8,5,5],[3,4,6], 5,4)=18
在这种情况下,从第 根柱子上升 个单位距离,然后在第 根柱子上升 个单位距离是最优的,因此函数应返回 。
这个例子满足子任务 的条件。
数据范围
对于所有输入数据,满足:
详细子任务附加限制及分值如下表所示。
子任务 | 分值 | 约束 |
---|---|---|
无附加限制 |