一、问题描述
一个旅行家想驾驶汽车从城市A到城市B(设出发时油箱是空的)。给定两个城市之间的距离dis、汽车油箱的容量c、每升汽油能行驶的距离d、沿途油站数n、油站i离出发点的距离d[i]以及该站每升汽油的价格p[i],i=1,2,…,n。设d[1]=0<d[2]<…<d[n]。要花最少的油费从城市A到城市B,在每个加油站应加多少油,最少花费为多少?
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”。
二、实验分析
贪心策略:优先在便宜的站点加油。如果下一站没有加过油且不是终点可达,加此时油箱能加的最大油量;如果下一站站加过油,加能到达下一站的油就行;如果当前站是第一次终点可达,加能达到终点的油量就行;如果当前站是终点可达,但不是第一次终点可达,加油量为0。【ps:终点可达 是指能当前油量加满后能达到终点,可能存在0个或多个终点可达】
此贪心策略能否达到全局最优?我觉得能,但是证明不知如何下手。
下图是测试例1的图解。
三、完整代码
//编译环境 vs 2019
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
using namespace std;
#include <algorithm>
int main()
{
int k = 0;
float res[10] = {
0 };
scanf("%d", &k);
for (int s = 0; s < k; s++) //对于每个测试案例
{
int d1 = 0, c = 0, d2 = 0, n = 0;
int cnt1 = 0, cnt2 = 0, b[80] = {
0 };
float d[80