poj 2431加油站问题

题目描述大概是这样的:

你开一辆汽车,已知车内的油箱是无限大的,初始有一定油量P,也已知你要走距离为L,而路上有N个加油站,每个加油站距离你初始位置的距离已知为 A[i],其中含有油量为 B[i], 那么你的问题就是如何在加油尽可能少的情况下走完全程,如果走不完输出  -1  ,反之输出你加油的次数。


关键字: 贪心,优先队列;

由于这是第一篇文章,所以大概叙述下这个博客的创作思路:

                为了防止思维江化(-1s),所有的题解 ,并不会直接写出代码,只会提供思路 以及尽可能多的测试数据,避免太过依赖以前的思路。


中心思想:

            这题我们目的是想尽可能少的加油,那么,比较喜欢出现的状况就是 ,加油站油多,而且我们能在油箱快没的时候加上,但是很明显,加油站是固定的,如果我们不在那里加油,那么就错过去了。

            可是,不妨想一下:如果我刚路过加油站就把这些油加上,和我油箱已经没了再把油加上,走的距离是不是相等?

 有了猜想我们来实践:

           目前有油 10L 走10km 然后假设突然见到加油站,补充油5L 又走了5km 合计 15km(当然现实里这显然不可能)

           假若我目前10L油,我足够深谋远虑,提前先加5L油 结果仍然是走了 15km。

假设是成立的,所以,这题的关键,在于把每个加油站看做我们可以携带的   “油桶”    ,只要需要,我们随时去补一下,而且我们只去补最大的那桶,但原题测试数据太过庞大,所以    优先队列  是解决问题的一个关键,根据这个特性,我们不断将  “  油桶  ”  放入队列,需要时再取出,便可做到加油次数最少。

以下提供一些 AC代码的测试数据 ,仅供参考:

10
15 20
14 22
10 21
1 5
6 13
25 41
26 33
9 9
7 7
6 4
35 25
1
2
1 10
15 1
17 5
-1
3
1 1
2 2
3 3
4 1
1
3
1 2
2 0
3 0
4 1
-1
4
1 3
2 6
3 0
5 8
10 1
-1



Problem D:汽车最少费用加油行驶 Description 给定一个 N*N 的方形网格, 设其左上角坐标为 (1, 1), X 轴向右为正, Y 轴向下为正, 每个方格边长为 1, 右下角坐标为 (N, N). 一辆已装满油的汽车从 (1, 1) 为起点出发驶向终点 (N, N). 在若干个网格交叉点处设有油库供汽车在行驶途中加油, 在起点与终点处不设油库. 汽车在行驶过程中遵守如下规则: 1. 只能沿网格边行驶, 装满油后能行驶 K 条网格边 2. 当行驶经过一条网格边时, 若其 X 坐标或 Y 坐标减小, 则应付费用 B, 否则免付费用 3. 在行驶过程中遇油库则应加满油并付加油费用 A 4. 在需要时可在网格点处增设油库, 并付增设油库费用 C (不含加油费用A) 上述各数中的 N, K, A, B, C 均为正整数. 求汽车从起点出发到达终点的一条所付费用最少的行驶路线所需要的费用. Input 输入数据的第一行是 N, K, A, B, C 的值, 2 ≤ N ≤ 100, 2 ≤ K ≤ 10. 第二行起是一个 N*N 的 0-1 方阵, 每行 N 个值, 至 N+1 行结束. 方阵的第 i 行第 j 列处的值为 1 表示在网格交叉点 (i, j) 处设置有一个油库, 为 0 时表示未设有油库. 各行相邻的两个数以空格分隔. Output 对于测试用例的输入数据, 在一行上输出最优行驶路线所需的费用, 即最小费用. Sample Input 9 3 2 3 6 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 Sample Output 12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值