- 1、本文档共22页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
NOIP2012DAY1改分析
drive 不是JZYZ的学生的小 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 行驶的路程总数的比值都最小,则输出海拔最高的那个城市。 2. 对任意给定的 X=Xi 和出发城市 Si,小 A 开车行驶的路程总数以及小 B 行驶的路程总数。 对于30%的数据,有1≤N≤20,1≤M≤20;对于40%的数据,有1≤N≤100,1≤M≤100;对于50%的数据,有1≤N≤100,1≤M≤1,000;对于70%的数据,有1≤N≤1,000,1≤M≤10,000;对于100%的数据,有:1≤N≤100,000;1≤M≤10,000;-1,000,000,000≤Hi≤1,000,000,000;0≤X0≤1,000,000,000;1≤Si≤N;0≤Xi≤1,000,000,000,数据保证Hi互不相同。 各个城市的海拔高度以及两个城市间的距离如图所示。如果从城市 1 出发,可以到达的城市为 2,3,4,这几个城市与城市 1 的距离分别为 1,1,2, 但是由于城市 3 的海拔高度低于城市 2,所以我们认为城市 3 离城市 1 最近,城市 2 离城市1 第二近,所以小 A 会走到城市 2。到达城市 2 后,前面可以到达的城市为 3,4,这两个城 市与城市 2 的距离分别为 2,1,所以城市 4 离城市 2 最近,因此小 B 会走到城市 4。到达城 市 4 后,前面已没有可到达的城市,所以旅行结束。如果从城市 2 出发,可以到达的城市为 3,4,这两个城市与城市 2 的距离分别为 2,1,由 于城市 3 离城市 2 第二近,所以小 A 会走到城市 3。到达城市 3 后,前面尚未旅行的城市为4,所以城市 4 离城市 3 最近,但是如果要到达城市 4,则总路程为 2+3=53,所以小 B 会 直接在城市 3 结束旅行。如果从城市 3 出发,可以到达的城市为 4,由于没有离城市 3 第二近的城市,因此旅行还未开始就结束了。如果从城市 4 出发,没有可以到达的城市,因此旅行还未开始就结束了。 此题全省最高分70 考察内容,排序+链表操作/线段树操作/平衡数操作(求第一大和第二大的值),二分,倍增 如果只要小数据:利用循环首先统计出一个地方可以到达的最短路径和次短路径,然后循环统计长度这样的话算法的复杂度会很高,前面会计算出很多后面没有用到的内容。 这里是一个预处理过程by张吉亮 全部AC的自己百度 首先将所有的城市的高度按照从小到大的顺序排列,然后从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 by 郭妹妹 2
文档评论(0)