小明购买了一辆续航里程数达 1000 公里的某自动驾驶新能源车。某一天车辆充满电后,需从甲城出发前往距离 D 公里远的乙城,全程走高速。车载导航提示沿途有 N 个休息站均可提供充电服务,各休息站均可实时提供当前充电排队时间,单位为小时。
请协助规划时间最优的休息站充电方案,返回最短的旅行用时。
为方便计算,高速上的行驶速度固定为 100 公里/小时。规划时可不必考虑保留安全续航里程数,汽车可以将电完全用光,1000 公里续航的汽车按 100 公里/小时,可以开 10 个小时。每次充电时间固定为 1 小时,完成后电量充满。各站点充电排队时间不会变化,充电排队过程不耗电
输入描述:
第一行表示甲乙两城的距离 D,单位为公里。
第二行表示沿途的休息站数量 N。
第三行起,每行 2 个数据,分别表示休息站离起点甲城的距离,以及充电排队所需时间,单位为小时。各休息站按离从近到远排序。 0 < = D < = 1000000 ,D 是 100 的整数倍 0 < = N < = 10000
输出描述:一个数字,表示花费最少的总时间
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int d = sc.nextInt();
int n = sc.nextInt();
int[][] row = new int[n + 2][2];
row[0][0] = 0;
row[0][1] = 0;
for(int i = 1;i < n + 1;i++){
row[i][0] = sc.nextInt();
//先加,防止代码重复计算
row[i][1] = sc.nextInt() + 1;
}
row[n+1][0] = d;
row[n+1][1] = 0;
int[] dp = new int[n+2];
Arrays.fill(dp,Integer.MAX_VALUE);
dp[0] = 0;
for(int i = 0;i <= n+1;i++){
for(int j = i - 1;j >= 0;j--){
if(row[i][0] - row[j][0] > 1000){
break;
}
//i是1就计算0 + 等待的时间,最后找最少的等待时间,从0开始就计算最开始第一次停下来的情况
dp[i] = Math.min(dp[j] + row[i][1],dp[i]);
}
}
System.out.print(dp[n + 1] + d / 100);
}
}