C. Tourist's Notes

题目链接

题意: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();
    }
}
原文地址:https://www.cnblogs.com/theskulls/p/4665726.html