【编程题m_0011】庆祝61

链接:https://www.nowcoder.com/questionTerminal/0c16f758949f4d17ab73a9a1ffe7ab9b
来源:牛客网

牛家庄幼儿园为庆祝61儿童节举办庆祝活动,庆祝活动中有一个节目是小朋友们围成一个圆圈跳舞。牛老师挑选出n个小朋友参与跳舞节目,已知每个小朋友的身高h_i。为了让舞蹈看起来和谐,牛老师需要让跳舞的圆圈队形中相邻小朋友的身高差的最大值最小,牛老师犯了难,希望你能帮帮他。
如样例所示:
当圆圈队伍按照100,98,103,105顺时针排列的时候最大身高差为5,其他排列不会得到更优的解

输入描述:

输入包括两行,第一行为一个正整数n(3 ≤ n ≤ 20)
第二行为n个整数h_i(80 ≤ h_i ≤ 140),表示每个小朋友的身高。

输出描述:

输出一个整数,表示满足条件下的相邻小朋友身高差的最大值。

示例1

输入

4
100 103 98 105

输出

5

解题思路:将第偶数个大的数据从后往前放置,第奇数个大的数据从前往后放置,然后依次计算第i和(i+1)%数组长度的差,取最大值。

package BiShiTi;

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

public class m_0011 {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n = Integer.parseInt(scan.nextLine());
		String h_i_Str = scan.nextLine();
		String[] h_i_Arr = h_i_Str.split(" ");
		int[] h_i = new int[n];
		for (int i = 0; i < n; i++) {
			h_i[i] = Integer.parseInt(h_i_Arr[i]);
		}

		int maxDValue = getMaxDValue(n, h_i);
		System.out.println(maxDValue);

	}

	static int getMaxDValue(int n, int[] h_i) {
		// 原始数据排序
		Arrays.sort(h_i);
		
		// 右边放第偶数个大的数据,左边放第奇数个大的数据
		int[] sorted_H_I_Arr = new int[n];
		int left = 0;
		int right = n - 1;
		for (int i = n - 1; i >= 0; i--) {
			if (i % 2 == 0) {
				sorted_H_I_Arr[right] = h_i[i];
				right -= 1;
			} else {
				sorted_H_I_Arr[left] = h_i[i];
				left += 1;
			}
		}
		
		// 一次计算i和i+1位置的差,并取最大值
		int maxDValue = -1;
		for (int i = 0; i < n; i++) {
			int value = Math.abs(sorted_H_I_Arr[i] - sorted_H_I_Arr[(i + 1) % n]);
			if (value > maxDValue) {
				maxDValue = value;
			}
		}

		return maxDValue;
	}
}

猜你喜欢

转载自my.oschina.net/MasterLi161307040026/blog/1811695