题目链接:蜗牛
import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int n=scanner.nextInt(); int[] x=new int[n+1]; for(int i=1;i<=n;i++){ x[i]=scanner.nextInt(); } int[] a=new int[n+1]; int[] b=new int[n+2]; for(int i=1;i<=n-1;i++){ a[i]=scanner.nextInt();//表示第i个柱子的传送起点高度 b[i+1]=scanner.nextInt();//表示第i个柱子被传送后到的高度 } double[][] dp=new double[n+1][2];//dp[i][0]表示第i个节点的时间,dp[i][1]表示到达第i个传送门的时间 dp[1][0]=x[1]; dp[1][1]=x[1]+a[1]/0.7; for(int i=2;i<=n;i++){ if(a[i]>=b[i]){ //第i个传送门位置=min(上一个节点所需的时间然后直接走到下一个柱子,再爬上传送门的时间,上一个传送门时间,然后直接传送过来,在判断当前传送到的高度和该柱子可以传送的高度) dp[i][1]=Math.min(dp[i-1][0]+x[i]-x[i-1]+a[i]/0.7,dp[i-1][1]+(a[i]-b[i])/0.7); } else{ dp[i][1]=Math.min(dp[i-1][0]+x[i]-x[i-1]+a[i]/0.7,dp[i-1][1]+(b[i]-a[i])/1.3); } //第i个节点时间=min(上一个节点所需时间,加上直接走过来的时间,上一个传送门的时间,然后传送过来,在计算下落到高度0的时间) dp[i][0]=Math.min(dp[i-1][1]+b[i]/1.3,dp[i-1][0]+x[i]-x[i-1]); } System.out.printf("%.2f",dp[n][0]); } }