zoukankan      html  css  js  c++  java
  • 2016蘑菇街编程题:最大间隔

    题目描述

    给定一个递增序列,a1 <a2 <...<an 。定义这个序列的最大间隔为d=max{ai+1 - ai }(1≤i<n),现在要从a2,a3 ..an-1 中删除一个元素。问剩余序列的最大间隔最小是多少?
    输入描述:
    第一行,一个正整数n(1<=n<=100),序列长度;接下来n个小于1000的正整数,表示一个递增序列。
    输出描述:
    输出答案。
    输入例子:
    5
    1 2 3 7 8
    输出例子:
    4
    解题

    当删除元素在原数组的最大间隔的两个元素时候最大间隔增大,当在其他位置时候,这个最大间隔不变,其他位置的间隔增加,但是在怎么增加也不会超过原始数组的最大间隔
    所有删除其中一个元素的最大间隔的最小值就是原始数组的最大间隔
    import java.util.Scanner;
    public class Main{
        public static void main(String [] args){
            Scanner in = new Scanner(System.in);
            int n,maxd=0;
            int[] A;
            while(in.hasNext()){
                n = in.nextInt();
                A = new int[n];
                for(int i =0;i<n;i++)
                    A[i] = in.nextInt();
                maxd = MaxDistanceMin(A,n);
                System.out.println(maxd);
            }
        }
        public static int MaxDistanceMin(int [] A,int n){
            int maxd = -1;
            for(int i=1;i<= n -1;i++){
                maxd = Math.max(maxd,A[i] - A[i-1]);
            }
            return maxd;
        }
    }
    这样是不是投机取巧了
    删除非元素最大间隔的两个元素,可能形成最大间隔
    如:
    1 3 5 8 11 12 最大间隔:3
    删除3,1 5 8 11 12 最大间隔:4
    删除5,1 3 8 11 12 最大间隔:5
    删除8,1 3 5 11 12 最大间隔:6
    删除11,1 3 5 8 12 最大间隔:4

    最大间隔最小值是4,上面程序又问题,测试样例对特殊情况没有考虑
    import java.util.Scanner;
    public class Main{
        public static void main(String [] args){
            Scanner in = new Scanner(System.in);
            int n,maxd=0;
            int[] A;
            while(in.hasNext()){
                n = in.nextInt();
                A = new int[n];
                for(int i =0;i<n;i++)
                    A[i] = in.nextInt();
                maxd = MaxDistanceMin(A,n);
                System.out.println(maxd);
            }
        }
        public static int MaxDistanceMin(int [] A,int n){
            int maxd = -1;
            int minMaxd = Integer.MAX_VALUE;
            int [] d = new int[n-1];
            // 记录相邻两个元素的间隔
            for(int i=1;i<= n -1;i++){
                d[i-1] = A[i] - A[i-1];
                maxd = Math.max(maxd,d[i-1]);// 求出最大间隔 
            }
            // 间隔d 向量元素合并,当大于maxd 的时候选取最小值
            for(int i=0;i<d.length-1 ;i++){
                int subd = d[i] + d[i+1];
                if(subd> maxd){// 新的最大间隔 
                    minMaxd = Math.min(minMaxd,subd);
                }else{
                    minMaxd = Math.min(minMaxd,maxd);
                }
            }
            return minMaxd;
        }
    }





  • 相关阅读:
    POJ训练计划1035_Spell checker(串处理/暴力)
    软考-数据库与标准化和知识产权
    分析Cocos2d-x横版ACT手游源码 1、公共
    增强版的RecycleViewAdapter,能够直接使用
    高考志愿,你们想好怎么填了吗?
    win32收不到F10按键消息解决的方法
    Json——使用Json jar包实现Json字符串与Java对象或集合之间的互相转换
    九度OJ #1437 To Fill or Not to Fil
    SQL数据分组后取最大值或者取前几个值(依照某一列排序)
    3.5星|《硅谷产品》:Facebook网红社区产品经理经验谈
  • 原文地址:https://www.cnblogs.com/bbbblog/p/5338309.html
Copyright © 2011-2022 走看看