本题导航点一下展开
补给站
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
补给站
题目背景
一支车队要从营地出发,横穿一条笔直的荒漠公路。公路沿线稀疏地分布着若干补给站,每个站点的油价都不一样。车队的油箱容量有限,队长必须精打细算:在哪个站加油、加多少升,直接决定了这趟行程的花费。
题目描述
公路可以看成一条数轴:营地建在坐标 处,目的地建在坐标 处。
公路沿线一共有 个补给站,第 个补给站位于坐标 处,每升油的价格为 元。补给站的位置满足 。
油车的油箱容量为 升。出发时油箱是满的,所以营地不需要花钱。油车每行驶 公里恰好消耗 升油;它只能开进补给站加油,而且:
- 一次加油只能加整数升油,加完之后油箱中的油量不能超过容量 ;
- 行驶过程中油量不能为负,也就是说,从营地到目的地之间的任何时刻,剩余油量都必须足够开到下一个落脚点;
- 如果某个站点距离上一个落脚点超过 公里,那么油车无论如何都开不过去。
请你计算:车队从营地出发、最终抵达目的地,最少需要花多少钱加油。如果无论怎么安排都无法抵达目的地,输出 。
注意:油车不必在每个补给站都加油,也可以在同一个补给站只加一部分油;油箱里的油可以一直带到后面的站点使用。
输入格式
从标准输入读入数据。
第一行三个整数 ,含义如题面所述。
接下来 行,每行两个整数 ,依次描述一个补给站的位置与油价。
输出格式
输出到标准输出。
一行一个整数,表示最小加油花费;如果无法抵达目的地,输出 -1。
样例 1 输入
2 5 10
3 5
7 1
样例 1 输出
13
样例 1 解释
出发时油箱里有 升油。开到坐标 的补给站耗掉 升,剩 升;在这里加 升油,花掉 元,油箱重新有 升。继续开到坐标 的补给站耗掉 升,油量为 ;在这里加 升油,花掉 元,正好开到终点。总花费 元,可以证明没有更便宜的安排。
样例 2 输入
1 3 10
4 1
样例 2 输出
-1
样例 2 解释
唯一的补给站位于坐标 ,而满油只能行驶 公里,开不到这个站,所以不可能抵达坐标 的目的地。
样例 3 输入
2 4 10
3 2
7 2
样例 3 输出
12
样例 3 解释
两个补给站的油价相同,都是 元/升(这就是下文特殊性质 A)。整趟行程一共要消耗 升油,其中出发时自带的 升是免费的,因此至少要买 升,花费 元。油车在坐标 处把油箱补满(买 升),开到坐标 后再买 升,正好到达终点,所以 元是可以达成的。
特殊性质
本题的数据中存在以下特殊性质,部分测试点会额外满足它们:
- 特殊性质 A:所有补给站的油价都相同,即 。此时总花费只由总耗油量决定:出发时自带的 升免费,所以只要油车能走完全程,答案就是 (若 则为 )。
- 特殊性质 B:油价从左到右单调不增,即 。此时每一站的油都比后面的站更贵,油车只需要“算好能撑到下一站”就可以,不需要反复比较后面所有站点的价格。
- 特殊性质 C:油箱容量足够从营地直接开到目的地,即 。此时根本不需要加油,只需判断沿路是否有跨不过去的空隙;若没有,答案是 。
数据范围与子任务
对全部测试数据,保证 ,,,,。
| 子任务 | 测试点 | 分值 | 特殊性质 | |||
|---|---|---|---|---|---|---|
| 1 | 无 | |||||
| 2 | ||||||
| 3 | A 或 C | |||||
| 4 | 无额外保证 |
各个子任务的测试点互相独立:不同子任务之间没有先后依赖,只按子任务内的测试点是否全部通过给分。
部分分提示
- 子任务 1 的数据很小,可以直接用 的 DP 暴力:状态记录“开到第 个站、油箱里还剩 升油”时的最小花费,枚举在这一站加多少升油。
- 子任务 2 允许 的做法:每到一站,向后扫描所有站点,找出第一个油价更低的站再决定加油量。
- 子任务 3 有特殊性质 A 或 C:满足 A 时只需判断油车能否走完全程,再输出 (负数取 );满足 C 时只需判断沿路是否有跨不过去的空隙,能通过则答案是 。
- 子任务 4 需要正解:先用单调栈预处理出“右侧第一个油价严格更低的补给站”,再按“能否开到那个更便宜的站”“是否能加满直接开到终点”分类转移,整体复杂度 。
注意答案可能很大,请使用 位整数保存花费。
提交说明
本题使用标准输入输出。程序应从标准输入读入数据,并将答案输出到标准输出。