题目描述:

小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 i 和城市 j 之间的距离 d[i,j]恰好是这两个城市海拔高度之差的绝对值,即 d[i, j] = |Hi-Hj|

旅行过程中,小 A 和小 B 轮流开车,第一天小 A 开车,之后每天轮换一次。他们计划选择一个城市 S 作为起点,一直向东行驶,并且最多行驶 X 公里就结束旅行。小 A 和小 B 的驾驶风格不同,小 B 总是沿着前进方向选择一个最近的城市作为目的地,而小 A 总是沿着前进方向选择第二近的城市作为目的地(注意:本题中如果当前城市到两个城市的距离相同,则认为离海拔低的那个城市更近)。如果其中任何一人无法按照自己的原则选择目的城市,或者到达目的地会使行驶的总距离超出 X 公里,他们就会结束旅行。

在启程之前,小 A 想知道两个问题:

1.对于一个给定的 X=X0,从哪一个城市出发,小 A 开车行驶的路程总数与小 B 行驶的路程总数的比值最小(如果小 B 的行驶路程为 0,此时的比值可视为无穷大,且两个无穷大视为相等)。如果从多个城市出发,小 A 开车行驶的路程总数与小 B 行驶的路程总数的比值都最小,则输出海拔最高的那个城市。

  1. 对任意给定的 X=Xi 和出发城市 Si,小 A 开车行驶的路程总数以及小 B 行驶的路程总数。

朴素算法:利用循环首先统计出一个地方可以到达的最短路径和次短路径,然后循环统计长度这样的话算法的复杂度会很高,前面会计算出很多后面没有用到的内容。

算法:首先将所有的城市的高度按照从小到大的顺序排列,然后从1-N枚举城市,其中由于只能跳到比它本身要大的数字所以每一次处理完这个城市后就将该城市弹出,由于经过了排序所以该城市的距离它最近的节点分别为它左右端的节点,所以首先看左边,因为左边的高度较低而在距离相同的情况下城市越高越远所以首先选择左边的第一和第二个节点(前提是存在) 然后根据题目描述放入右边的节点。注意要特殊处理右边的第二个节点因为如果右边的距离更小的话那么就可以选择右边的。然后用数组G来存储从i出发的 j 表示第 2^(j+1)的城市的编号 G[i][j] 然后因为要分别处理a开车和b开车的距离所以使用f[i][j][k]来表示他们分别开车的距离和G数组一一对应 i 表示出发的城市, j 表示从 i 出发第 2^(j+1)的城市位置, k表示到达城市的a开车的距离 和b开车的距离 用0 和 1 表示然后就可以通过倍增计算出两点之间不超过 X 的最大距离

【NOIP2012】开车旅行相关推荐

  1. NOIP2012 开车旅行

    开车旅行 (drive.cpp/c/pas) [问题描述] 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度 ...

  2. NOIP2012开车旅行 【倍增】

    题目 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为Hi,城市 i 和城 ...

  3. NOIP2012 开车旅行 (倍增)

    题意:一行N个城市,有各自不同的海拔,定义两个城市之间的距离为海拔之差的绝对值,小a和小b轮流开车,开车方向从左往右,小a总是开到第二近的城市,小b开到最近的城市(如有两个城市和当前城市海拔之差相等, ...

  4. [NOIp2012]开车旅行

    Description Luogu1081 Solution 首先可以暴力模拟走的过程即可得70分. 观察暴力效率低下的原因,其一是向前走的时候比较慢,用倍增的思路优化即可.其二是读入时处理的每个点到 ...

  5. NOIp2012开车旅行

    思路 我觉得难的是预处理,非常的麻烦:倍增比较好理解: 首先可以用线段树啊,双向链表啊,平衡树啊,二叉搜索树啊什么的(雾),我用的是set,倒序查找(因为只能走到比当前点序号要大的点),在set中查找 ...

  6. NOIP2012提高组 开车旅行 解题报告

    开车旅行 题目描述 样例输入 样例输出 70分算法 暴力预处理出对于每一个点他右边最近.次近的点的编号,对于每一个询问,暴力模拟开车过程即可. 100算法 和上面一样我们得预处理出每一个点最近.次近的 ...

  7. 刷题记录(NC16562 开车旅行)(树上倍增)

    NC16562 开车旅行 题目链接 关键点: 1.预处理:将所有点到达另一个点的最短和次短距离先求出 方法:利用set,从最后一个城市开始插入,每次插入到set中,查看左右是否存在有城市(即set是按 ...

  8. 【NOIP2012提高组】开车旅行

    Description 现在有n个城市,每个城市有它的高度 Hi H_i,保证每个 Hi H_i互不相同.我们定义两个城市之间的距离 disi,j=|Hi−Hj| dis_{i,j}=|H_i-H_j ...

  9. P1081 [NOIP2012 提高组] 开车旅行(倍增)(动态规划)

    洛谷传送门 文章目录 题目描述 解析 代码 题目描述 解析 利用倍增,设计dp慢慢敲即可... 注意距离累加在一起会爆int,需要ll 特判条件非常之复杂... 心力交瘁,就酱了 代码 #includ ...

最新文章

  1. WPF TabControl Unload俩次的解决方案
  2. BZOJ 3740. 【TJOI2014】电源插排
  3. nodejs mysql 连接池初始化_nodejs之mysql连接池
  4. python如何读取文件夹下的子文件夹
  5. 基于Amarok的跨平台音乐播放器:Clementine mac版
  6. 编写第一个Linux环境下程序的编译,下载记录
  7. 启动两个tomcat,两个端口,两个tomcat都启动时回显示端口被占用
  8. pytorch 保存模型出错, pickler.dump(obj) Error
  9. 《Tomcat权威指南》读书笔记
  10. dnf红眼补丁在哪下载_dnf狂战士技能血色补丁-DNF狂战士技能红色补丁下载 v3.23完全版--pc6下载...
  11. iOS 图片压缩策略
  12. 混凝土塔吊浇筑怎么计算机械费,秒懂塔吊和施工电梯费用的摊销成本测算~
  13. 计算机考研专业课除了408,2020贵州大学计算机专业课改考408
  14. 【英语阅读】纽约时报 | “杀死我们的将是饥饿,而不是新冠病毒”
  15. 美国电话号码大全_美国
  16. python库吐血整理
  17. NYNU_ACM 实验室招新月赛题解
  18. Kafka教程(三):原理及存储
  19. 归并排序(递归,非递归)
  20. kubelet重新安装新版本报错Unit kubelet.service entered failed state.

热门文章

  1. echarts中怎么把x轴文字方向设置为竖向
  2. fiddler限制网速,自定义限制网速
  3. 【安全牛学习笔记】DNS协议隧道、DNS协议隧道-dns2tcp
  4. 计算机科学与技术考研知识,浙江大学计算机科学与技术考研
  5. 英语学习打卡(第二天)
  6. 请描述下你对 Vue 生命周期的理解?在 created 和 mounted 这两个生命周期中请求数据有什么区别呢?
  7. VMware虚拟机安装CentOS8 2023最新详细图文安装教程(VMware虚拟机安装+CentOS8下载+CentOS相关配置及运行)
  8. 《跟我学算法系列文章——一文学会数据结构套路》
  9. linux下开通ftp用户及可能遇到的问题排查方法
  10. 企业软文媒体投稿收录效果差是什么原因?如何解决?