题目描述:小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,仅供参考。