2017京东爬山编程题

258 阅读1分钟

题目描述:小B曾经酷爱网络游戏,整日通宵达旦地玩游戏,导致身体素质急剧下降,因此下决心痛改前非,远离一切电子产品,并通过远足爬山的方式改变生活方式并提高身体素质。由于担心对身体造成太大的负荷,他总是选择最平坦的路径,并记录每天的行程情况及达到的最高海拔,使得连续两天之间的海拔之差最多为一个单位。不幸的是,在行程结束时,他不小心掉进河里,造成部分记录信息遗失。他想知道自己行程中可能达到的最高海拔,你是否能够帮忙?
输入:
输入有若干组,每组的第一行为空格分隔的两个整数n和m,1<=n<=10^8,1<=m<=10^5,分别表示行程天数以及未遗失的记录数。随后紧跟m行,每行为空格分隔的两个整数d和h,1<=d<=n,0<=h<=10^8,表示行程的第几天及当天达到的最高海拔。
输出:
对每组输入,如果记录是可能的,则在单独的行中输出可能达到的最高海拔,否则输出字符串”IMPOSSIBLE”(不含引号)。
样例输入:
8 2
2 0
7 0
8 3
2 0
7 0
8 3
样例输出:
2
IMPOSSIBLE

Hint

第一天和最后一天的海拔可以是任意值。

解题思路:

①先判断输入的第一个数到第一天的最大值

②再判断输入的第一天到最后一天的最大值

③最后判断输入的最后一天到实际的最后一天的最大值

import java.util.*;

/**
 * Created by ZNB on 2016/9/6.
 */
public class JdClimb {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Map<Integer, Integer> eachDayOfHigh = new HashMap<Integer, Integer>();
        List<Integer> dayList = new ArrayList<Integer>();
        while (scanner.hasNext()) {
            int n = scanner.nextInt();//天数
            int m = scanner.nextInt();//未遗失的记录数
            for (int i = 0; i < m; i++) {
                int d = scanner.nextInt();
                int h = scanner.nextInt();
                dayList.add(i, d);
                eachDayOfHigh.put(d, h);
            }
            //对输入的天数排序
            Collections.sort(dayList);

            //1.处理第一个数据到第一天的最大值
            int max = eachDayOfHigh.get(dayList.get(0)) + dayList.get(0) - 1;

            //2.处理中间数据的最大值
            for (int i = 0; i <= dayList.size() - 2; i++) {
                if (Math.abs(eachDayOfHigh.get(dayList.get(i)) - eachDayOfHigh.get(dayList.get(i + 1))) > (dayList.get(i + 1) - dayList.get(i))) {
                    System.out.println("IMPOSSIBLE");
                    System.exit(0);
                } else {
                    //计算中间的最大值
                    int tmp = (eachDayOfHigh.get(dayList.get(i)) + eachDayOfHigh.get(dayList.get(i + 1))) / 2 + (dayList.get(i + 1) - dayList.get(i)) / 2;
                    if (tmp > max) {
                        max = tmp;
                    }
                }
            }
            //3.处理输入最后一个日期到结尾的最大值
            int temp = eachDayOfHigh.get(dayList.get(m - 1)) + (n - dayList.get(m - 1));
            if (temp > max)
                max = temp;
            System.out.println(max);
        }
    }
}

PS:未测试是否AC,仅供参考。