题目描述

这天,小明在修路。

他需要修理两条平行的道路 A, B,两条路上面分别有 n 个和 m 个点需要维修,它们相对于道路起点的距离分别为 a1, a2, . . . , an 和 b1, b2, b, …, bm。如图,两条路之间的距离为 d 且它们起点 (最左端) 的连线和两条路都垂直。小明的起点为道路 A 的起点,他需要尽可能快地遍历这些需要维修的 n + m 个点,他既可以沿着道路 向右 行走,也可以在两条道路之间的空地上 随意 行走。

小明想知道遍历这些点的最短路程是多少。

输入格式

输入共三行,第一行为三个正整数 n, m, d。
第二行为 n 个由空格隔开的正整数 a1, a2, …, an。
第三行为 m 个由空格隔开的正整数 b1, b2, …, bm。

输出格式

一行,一个浮点数,表示答案,保留两位小数。

样例输入

2 2 2
2 1
1 2

样例输出

5.24

思路:(被一个函数恶心到了),求最短路径,因为某个点它会从A路的前一个点或者B路的某个点走过来,所以判断是dp题。然后我就开始想先初始化状态,一开始设置的二维数组,表示已走过A路前i个点和B路的前j个点。然后再思考状态转移方程的时候发现不能确定我最后是在A路还是B路,所以我就再加了一维表示我现在在A路还是B路。
首先,我们先考虑

初始化

先把a,b这两数组按升序排下序,这题真的太老六了,我也是在运行样例的时候发现的。
如果我们一直没修B,一直修A,那么在A路上
dp[i][0][0] = a[i];
在B路上,Double.POSITIVE_INFINITY表示正无穷(学到了)
dp[i][0][1] = Double.POSITIVE_INFINITY;

如果一直修B,没修A,
在A路上,
dp[0][i][0] = Double.POSITIVE_INFINITY;
在B路上,
注意了,小明一开始在A路的起点,如果要先修B,必须先走到B才行

dp[0][0][1] = d;//一开始先走到B

dp[0][1][0] = Double.POSITIVE_INFINITY;//无法在最后停在A路的情况下,A路一个不走然后走一个B
dp[0][1][1] = hypot(d, b[1]);//从A的起点先走B的第一个点。

dp[0][i][1] = b[i] - b[i - 1] + dp[0][i - 1][1];//一直走B

状态转移方程

这个就容易多了
当前若是要求dp[i][j]
某个点若最后停在了A路,那么他可以由A路前边那个点(i-1)走过来,或者有B路的j点走过来
dp[i][j][0] = Math.min(dp[i - 1][j][0] + a[i] - a[i - 1], dp[i - 1][j][1] + hypot(d, a[i] - b[j]));
某个点若最后停在了B路,那么他可以由B路前边那个点(i-1)走过来,或者有A路的j点走过来
dp[i][j][1] = Math.min(dp[i][j - 1][1] + b[j] - b[j - 1], dp[i][j - 1][0]+ hypot(d, a[i] - b[j]));

hypot函数欧几里得范数,而不会出现中间上溢或下溢(直接用Math.sqrt()老是数组越界,很烦)

import java.util.*;
import static java.lang.Math.hypot;
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n=sc.nextInt();int m=sc.nextInt();int d=sc.nextInt();int[] a = new int[n + 1];int []b = new int[m + 1];double[][][] dp = new double[n + 1][m + 1][2];for (int i = 1; i <= n; i++) a[i] = sc.nextInt();for (int i = 1; i <= m; i++) b[i] = sc.nextInt();Arrays.sort(a, 1, n + 1);Arrays.sort(b, 1, m + 1);for (int i = 1; i <= n; ++i) {dp[i][0][1] = Double.POSITIVE_INFINITY;dp[i][0][0] = a[i];}if (m > 0) {dp[0][1][0] = Double.POSITIVE_INFINITY;dp[0][1][1] = hypot(d, b[1]);dp[0][0][1] = d;}for (int i = 2; i <= m; ++i) {dp[0][i][0] = Double.POSITIVE_INFINITY;dp[0][i][1] = b[i] - b[i - 1] + dp[0][i - 1][1];}for (int i = 1; i <= n; ++i)for (int j = 1; j <= m; ++j) {dp[i][j][0] = Math.min(dp[i - 1][j][0] + a[i] - a[i - 1], dp[i - 1][j][1] + hypot(d, a[i] - b[j]));dp[i][j][1] = Math.min(dp[i][j - 1][1] + b[j] - b[j - 1], dp[i][j - 1][0]+ hypot(d, a[i] - b[j]));}System.out.println(String.format("%.2f", Math.min(dp[n][m][0],dp[n][m][1])));sc.close();}}

蓝桥杯2022年第十三届决赛真题-修路相关推荐

  1. 蓝桥杯省赛考点_【蓝桥杯单片机01】从历年决赛真题中寻找单片机常见的考点...

    [蓝桥杯单片机01]从历年决赛真题中寻找单片机常见的考点 广东职业技术学院  欧浩源 [第三届:门禁系统] 1.功能简述 "门禁系统"主要有两种工作模式: 模式1:7:00-22: ...

  2. 蓝桥杯2022年第十三届嵌入式详解

    此前也发了关于蓝桥杯的题目,昨天刚比完赛,放松了一下,没来得及整理,早上我就把我所有的思路整理了一下,发出来,希望能帮到大家.当然也有很多不足的地方,希望大家能提出,我们一起讨论. 首先,关于题目的功 ...

  3. 蓝桥杯2022年第十三届省赛真题-纸张尺寸

    题目描述 在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm × 841mm,将 A0 纸沿长边对折后为 A1 纸,大小为 841mm × 594mm,在对折的过程中长度直接取下整(实际裁 ...

  4. 蓝桥杯题目 2682: 蓝桥杯2022年第十三届省赛真题-GCD

    题目描述 给定两个不同的正整数 a, b,求一个正整数 k 使得 gcd(a + k, b + k) 尽可能大,其中 gcd(a, b) 表示 a 和 b 的最大公约数,如果存在多个 k,请输出所有满 ...

  5. 消除游戏——蓝桥杯2022年第十三届省赛真题

    题目描述 在一个字符串 S 中,如果 S i = S i−1 且S i 不等于S i−1,则称 S i 和 S i+1 为边缘字符.如果S i 不等于S i−1且 S i = S i+1,则 S i− ...

  6. 每日一题——质因数个数(蓝桥杯2022年第十三届省赛真题)

    如何将一个正整数分解质因数:每日一题--将一个正整数分解质因数_笨小古的博客-CSDN博客 题目描述:给定正整数 n,请问有多少个质数是 n 的约数. 输入格式:输入的第一行包含一个整数 n. 输出格 ...

  7. 蓝桥杯2022年第十三届省赛真题-选数异或

    题目描述 给定一个长度为 n 的数列 A1, A2, · · · , An 和一个非负整数 x,给定 m 次查询, 每次询问能否从某个区间 [l,r] 中选择两个数使得他们的异或等于 x . 输入 输 ...

  8. 蓝桥杯第十三届决赛真题-左移右移

    左移右移 一.思路分析 二.数组模拟双链表❗️❗️ 三.代码展示 题目链接 问题描述 小蓝有一个长度为 N 的数组, 初始时从左到右依次是 1,2,3, -N . 之后小蓝对这个数组进行了 M 次操作 ...

  9. 蓝桥杯2022年第十三届省赛真题-积木画

最新文章

  1. PHP判断变量内容是什么编码
  2. 使用PaddleFluid和TensorFlow训练序列标注模型
  3. php 中文转成url,php字符转URL地址的函数
  4. 能够使用StringBuilder类的常用方法操纵字符串 1215
  5. Java定时任务调度工具详解之Timer篇
  6. 使用ConcurrentLinkedQueue惨痛的教训
  7. 将Maven集成到idea中并创建第一个Maven项目
  8. 模拟image的ajaxPrefilter与ajaxTransport处理
  9. java 降低jdk版本_jdk1.7降级到1.6 | 学步园
  10. java中代码pu_一、线程Java代码实现1.继承Thread声明Thread的子类public class MyThread extends Thread { pu...
  11. 参考文献格式字号字体_参考文献标准格式字体
  12. 机器学习分析租房价格的影响因素
  13. 极课大数据完成C轮融资,投资方为好未来
  14. (转)StrictMode使用详解,strictmode
  15. hp1015驱动64位_在win10/win7 64位系统上安装 hp laserjet 1015对应的打印机驱动
  16. 我常去的ios开发论坛/iphone开发论坛
  17. 《解读基金我的投资观与实践》读后感
  18. html nthchild作用,详解CSS中:nth-child的用法
  19. h5 + js 炫酷相册
  20. 小傻蛋的妹妹跟随小甲鱼学习Python的第十六节016

热门文章

  1. 开通微信零钱通的方法微信免手续费提现
  2. Oracle项目管理主数据之CBS
  3. SSM (JDK 1.7) 使用Rabbit MQ
  4. Flask—静态资源配置
  5. python modis数据拼接_python调用HEG工具批量处理MODIS数据的方法及注意事项
  6. QT信号槽与connect的常见写法
  7. Linux下如何查看一个文件是否拥有软链接或硬链接文件?
  8. 【百金轻】:雄关漫道真如铁,而今迈步从头越。
  9. “共识2018”北京区块链大会上BNET创始人刘建军发表了“通信网的未来”的重要演讲
  10. php friend_Model/Friend.php · 跳跳虎1986/cwj - Gitee.com