牛家庄幼儿园为庆祝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();
}
}
复制
