算法设计 加油问题
1. 问题描述
一个旅行家想驾驶汽车从城市A到城市B(设出发时油箱是空的)。给定两个城市之间的距离dis、汽车油箱的容量c、每升汽油能行驶的距离d、沿途油站数n、油站i离出发点的距离d[i]以及该站每升汽油的价格p[i],i=1,2,…,n。设d[1]=0<d[2]<…<d[n]。要花最少的油费从城市A到城市B,在每个加油站应加多少油,最少花费为多少?
2. 具体要求
Input
输入的第一行是一个正整数k,表示测试例个数。接下来几行是k个测试例的数据,每个测试例的数据由三行组成,其中第一行含4个正整数,依次为A和B两个城市之间的距离d1、汽车油箱的容量c(以升为单位)、每升汽油能行驶的距离d2、沿途油站数n (1<=n<=200);第二行含n个实数d1, d2 ,…, dn,表示各油站离出发点的距离(d1=0);第三行含n个实数p1, p2 ,…, pn,表示各油站每升汽油的价格。同一行的数之间用一个空格隔开。
Output
对于每个测试例输出一行,含一个实数,表示从城市A到城市B所要花费的最少油费(输出的结果精确到小数点后一位)。若问题无解,则输出“No Solution”。
3. 测试数据
Sample Input
2
1500 50 10 4
0 300.0 800.0 1200.0
4.0 5.0 4.0 4.5
1000 40 10 3
0 500.0 750.0
4.5 5.0 4.2
Sample Output
640.0
No Solution
思路:
从当前加油站开始,每次选择的加油站符合:
- 当前站加满油后可以到达,如果不等到达则可以认为此题无解
- 在所有可以到达的加油站中选择价格最低的
- 如果当前站的价格最低就加满油,否则就使加的油刚好可以到达价格最低的加油站
- 终点站特殊考虑
代码:
/// <summary>
/// 寻找最好的加油站和下一个要去的加油站
/// </summary>
/// <param name="bestStation">最好的加油站</param>
/// <param name="nextStation">下一个要去的加油站</param>
/// <param name="d"></param>
/// <param name="p"></param>
/// <param name="n"></param>
/// <param name="curStation"></param>
/// <param name="c"></param>
/// <param name="d2"></param>
void bestNextStation(int& bestStation, int& nextStation,float* d, float* p, int n, int curStation, int c, int d2)
{
bestStation = curStation;
int i = curStation + 1;
for (; i < n