天天看點

慶祝61

牛家莊幼稚園為慶祝61兒童節舉辦慶祝活動,慶祝活動中有一個節目是小朋友們圍成一個圓圈跳舞。牛老師挑選出n個小朋友參與跳舞節目,已知每個小朋友的身高h_i。為了讓舞蹈看起來和諧,牛老師需要讓跳舞的圓圈隊形中相鄰小朋友的身高差的最大值最小,牛老師犯了難,希望你能幫幫他。

如樣例所示:

當圓圈隊伍按照100,98,103,105順時針排列的時候最大身高差為5,其他排列不會得到更優的解

輸入描述:

輸入包括兩行,第一行為一個正整數n(3 ≤ n ≤ 20)

第二行為n個整數h_i(80 ≤ h_i ≤ 140),表示每個小朋友的身高。

輸出描述:

輸出一個整數,表示滿足條件下的相鄰小朋友身高差的最大值。

輸入例子:

4

100 103 98 105

輸出例子:

5

import java.util.Arrays;
import java.util.Scanner;

/*
 * 考慮我們已經将身高升序排序了,然後對于前k個小朋友組成隊形的身高差的最大值的最小值為f(k),
 * 并且第k個和第(k-1)個小朋友是相鄰的。現在我們加入第(k+1)個小朋友,
 * 考慮到第(k + 1)個小朋友身高是大于等于前面的小朋友,
 * 插入隊形之後,第(k + 1)個小朋友一定與兩個小朋友相鄰, 
 * 是以當我們将第(k + 1)個小朋友插入到第k個和第(k - 1)個小朋友中間可以得到f(k + 1)
 * 的下界一定是max(f(k), h[k] - k[k - 2]),
 * 我們又注意到這樣插入之後第(k + 1)個和第k個小朋友還是相鄰的,于是這樣可以一直推廣下去。
 * 考慮最初3個小朋友的時候這樣也是可行的, 于是問題變成了求max(h[i] - h[i - 2])。
 */

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        int[] num = new int[N];
        for(int i = 0 ; i < N ; i++){
            num[i] = in.nextInt();
        }
        Arrays.sort(num);
        int min = 0;
        for(int i = 2 ; i < N ; i++){
            min = Math.max(min,num[i]-num[i-2]);
        }
        System.out.print(min);
        in.close();
    }

}           

複制

慶祝61
慶祝61