题意:n天内登山,相邻两次登山的高度差的绝对值小于等于1,也就是说每次高度变化只能是:0,1,-1.我们已经知道n天中部分天数人所在的山的高度,求最大的登山高度。
输入:
n m n 是天数,m是已经知道的登山天数
di dhi di天,所在的高度是dhi,共有m行
输出:
最大的登山高度。
Java程序:
import java.util.Scanner; public class C538 { public static void run(){ Scanner in = new Scanner(System.in); int n=in.nextInt(); int m=in.nextInt(); int ans = 0; int res = 0; int prea =in.nextInt(); int preb =in.nextInt(); m--; ans=preb+prea-1;// 第一次之前,可能的最大高度 int a=0;int b=0; boolean flag=true; while(m!=0){ a=in.nextInt(); b=in.nextInt(); if(Math.abs(b-preb) >a-prea)// 为真,说明中间有走的步长 大于 1 或小于 -1 flag = false; if(flag){ int disd= a-prea; int dish=b-preb; if(dish>=0){ // prea 到 a 高度上升 ,dish是两次的高度差 res=preb+dish;// 走了dish 高度,要dish天 disd-=dish; // 减去后的值,是走完disd天,高度没有变化 res+=disd/2;// 步长-1 1 最大的高度是先走disd/2 再下降 disd/2 (共disd天) ans=Math.max(ans, res); //最大值是最大的高度 }else{// prea 到 a 高度下降了 disd+=dish; // dish有效的下降天数,等式的结果是在disd天内高度没有变化 res =preb+disd/2; // 最大的高度是在disd/2 天内高度上升disd/2 ans = Math.max(ans,res); } } prea =a; preb =b; m--; } if(flag){ preb+=n-prea; ans = Math.max(ans, preb); System.out.println(ans); }else System.out.println("IMPOSSIBLE"); } public static void main(String[] args){ run(); } }