蓝桥杯 Java 算法训练 旅行家的预算

算法训练 旅行家的预算

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
  一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di、每升汽油价格Pi(i=1,2,……N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
输入格式
  第一行为4个实数D1、C、D2、P与一个非负整数N;
  接下来N行,每行两个实数Di、Pi。
输出格式
  如果可以到达目的地,输出一个实数(四舍五入至小数点后两位),表示最小费用;否则输出“No Solution”(不含引号)。
样例输入
275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2
样例输出
26.95

import java.util.*;
public class 旅行家的预算 {
	public static void main(String[] args)
	{
		Scanner sc=new Scanner(System.in);
		double D1=sc.nextDouble();//两个城市之间的距离
		double C=sc.nextDouble();//汽车油箱的容量
		double D2=sc.nextDouble();//每升油能行驶的距离
		double P=sc.nextDouble();//出发点的油价
		
		int N=sc.nextInt();//沿途油站数
		double[] Pi=new double[N+2];//每个站点的油价
		double[] D=new double[N+2];//离出发点的距离
		double MaxDistance=D2*C;
		
		//初始化距离和油价数组,将起点与终点也加入其中
		D[0]=0;Pi[0]=P;
		D[N+1]=D1;Pi[N+1]=0;
		for(int i=1;i<=N;i++) {
			D[i]=sc.nextDouble();
			Pi[i]=sc.nextDouble();
		}
		
		double fee=0;
		double remain=0;
		//无解的情况
		for(int i=0;i<=N;i++)
			if(D[i+1]-D[i]>MaxDistance) {
				System.out.println("No Solution");
				return ;
			}

		//有解,开始遍历每一个站点
		int i=0;
		while(i<=N)
		{
			int j;
			for(j=i+1;j<=N+1;j++)
			{
				if (D[j]-D[i]>MaxDistance) 
				{
					j-=1;//最大行驶距离无法到达j,因此最大到达j-1站点
					break;
				}
				if(Pi[j]<=Pi[i])
					break;//找到下一个更便宜的加油站
			}
		
			if(Pi[j]<=Pi[i]) //找到了下一个更便宜的加油站
			{
				fee+=((D[j]-D[i])/D2-remain)*Pi[i];//更新费用
				remain=0;//更新到达下一个加油站后的剩余油量
			}	
			else//没有找到加满油
			 {
				fee+=(C-remain)*Pi[i];
				remain=C-(D[j]-D[i])/D2;
			}
			
			i=j;//前往下一个加油站,滴滴滴!
		}
		System.out.println(String.format("%.2f", fee));
	}
}

你可能感兴趣的:(蓝桥杯java,java,算法)