zoukankan      html  css  js  c++  java
  • 开车旅行 [NOIP 2012]

    Description

    小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 行驶的路程总数。

    Input

    第一行包含一个整数 N,表示城市的数目。
    第二行有 N 个整数,每两个整数之间用一个空格隔开,依次表示城市 1 到城市 N 的海拔高度,即H1,H2,……,Hn,且每个Hi都是不同的。
    第三行包含一个整数 X0。
    第四行为一个整数 M,表示给定M组Si和 Xi。
    接下来的M行,每行包含2个整数Si和Xi,表示从城市 Si出发,最多行驶Xi公里。

    Output

    输出共M+1 行。
    第一行包含一个整数S0,表示对于给定的X0,从编号为S0的城市出发,小A开车行驶的路程总数与小B行驶的路程总数的比值最小。
    接下来的 M 行,每行包含 2 个整数,之间用一个空格隔开,依次表示在给定的 Si和Xi下小A行驶的里程总数和小B 行驶的里程总数。

    Sample Input

    样例1:
    4
    2 3 1 4
    3
    4
    1 3
    2 3
    3 3
    4 3
    样例2:
    10
    4 5 6 1 2 3 7 8 9 10
    7
    10
    1 7
    2 7
    3 7
    4 7
    5 7
    6 7
    7 7
    8 7
    9 7
    10 7

    Sample Output

    样例1:
    1
    1 1
    2 0
    0 0
    0 0
    样例2:
    2
    3 2
    2 4
    2 1
    2 4
    5 1
    5 1
    2 1
    2 0
    0 0
    0 0

    Hint

    样例1提示:

    P

    各个城市的海拔高度以及两个城市间的距离如上图所示。

    如果从城市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=5>3,所以小 B 会直接在城市3结束旅行。

    如果从城市3出发,可以到达的城市为4,由于没有离城市3 第二近的城市,因此旅行还未开始就结束了。

    如果从城市4出发,没有可以到达的城市,因此旅行还未开始就结束了。

    样例2说明:
    当 X=7时,
    如果从城市1出发,则路线为 1 -> 2 -> 3 -> 8 -> 9,小A 走的距离为1+2=3,小B走的距离为 1+1=2。(在城市 1 时,距离小 A 最近的城市是 2 和 6,但是城市 2 的海拔更高,视为与城市1第二近的城市,所以小A 最终选择城市 2;走到9后,小A只有城市10 可以走,没有第2选择可以选,所以没法做出选择,结束旅行)
    如果从城市2出发,则路线为 2 -> 6 -> 7 ,小A 和小B走的距离分别为 2,4。
    如果从城市3出发,则路线为 3 -> 8 -> 9,小A和小B走的距离分别为 2,1。
    如果从城市4出发,则路线为 4 -> 6 -> 7,小A和小B走的距离分别为 2,4。
    如果从城市5出发,则路线为 5 -> 7 -> 8 ,小A 和小B走的距离分别为 5,1。
    如果从城市6出发,则路线为 6 -> 8 -> 9,小A和小B走的距离分别为 5,1。
    如果从城市7出发,则路线为 7 -> 9 -> 10,小A 和小B走的距离分别为 2,1。
    如果从城市8出发,则路线为 8 -> 10,小A 和小B走的距离分别为2,0。
    如果从城市 9 出发,则路线为 9,小 A 和小 B 走的距离分别为 0,0(旅行一开始就结束了)。
    如果从城市10出发,则路线为 10,小A 和小B 走的距离分别为0,0。
    从城市 2 或者城市 4 出发小 A 行驶的路程总数与小 B 行驶的路程总数的比值都最小,但是城市2的海拔更高,所以输出第一行为2。
    数据范围:
    对于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互不相同。

    思路

    对于第一问,显然,一个是要枚举每个起点,计算A,B走的距离。

    对于第二问,就是给定起点,计算A,B走的距离

    总之一句话:给定距离范围,计算A,B走的距离

    显然我们要预处理出每个点第一近与第二近的点,

    然后暴力跳???显然是会T飞的

    如何跳得更快?我们可以想到倍增

    但是如何确定当前点是A跳还是B跳?

    这时候我们可以运用整体思想,把一次A跳和一次B跳当作一个整体

    最后在单独判断A还能不能跳

    这不就完美解决了吗?

    代码

  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1046 Shortest Distance (20)
    1061 Dating (20)
    1041 Be Unique (20)
    1015 Reversible Primes (20)(20 分)
    pat 1027 Colors in Mars (20)
    PAT 1008 Elevator (20)
    操作系统 死锁
    Ajax的get方式传值 避免& 与= 号
    让IE浏览器支持CSS3表现
  • 原文地址:https://www.cnblogs.com/ibilllee/p/7669972.html
Copyright © 2011-2022 走看看