2018校招真題編程題(網易)瘋狂隊列

題目描述
小易老師是非常嚴厲的,它會要求所有學生在進入教室前都排成一列,並且他要求學生按照身高不遞減的順序排列。有一次,n個學生在列隊的時候,小易老師正好去衛生間了。學生們終於有機會反擊了,於是學生們決定來一次瘋狂的隊列,他們定義一個隊列的瘋狂值爲每對相鄰排列學生身高差的絕對值總和。由於按照身高順序排列的隊列的瘋狂值是最小的,他們當然決定按照瘋狂值最大的順序來進行列隊。現在給出n個學生的身高,請計算出這些學生列隊的最大可能的瘋狂值。小易老師回來一定會氣得半死。
輸入描述:
輸入包括兩行,第一行一個整數n(1 ≤ n ≤ 50),表示學生的人數
第二行爲n個整數h[i](1 ≤ h[i] ≤ 1000),表示每個學生的身高
輸出描述:
輸出一個整數,表示n個學生列隊可以獲得的最大的瘋狂值。

如樣例所示:
當隊列排列順序是: 25-10-40-5-25, 身高差絕對值的總和爲15+30+35+20=100。
這是最大的瘋狂值了。
示例1
輸入
5
5 10 25 40 25
輸出
100

import java.util.*;

public class CreazyQueue {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int array[] = new int[n];
        for(int i=0;i < n;i ++){
            array[i] = scanner.nextInt();
        }
        Arrays.sort(array);
        if(n == 1){
            System.out.println(0);
        }
        if(n == 2){
            System.out.println(Math.abs(array[1] - array[0]));
        }
        if(n == 3){
            int a = Math.abs(array[1] - array[0]);
            int b = Math.abs(array[2] - array[0]);
            System.out.println(a + b);
        }
        else{
            int sum = Math.abs(array[n - 1] - array[0]) + Math.abs(array[n - 2] - array[0]);
            int index = n;
            for(int i = 1,j = index - 1;i <= index - 1 && j-2 >= i;i ++,j --){
                sum += array[j] - array[i];
                sum += array[j - 2] - array[i];
            }
            System.out.println(sum);
        }
    }
}

這題畫個圖說下思路:應該是貪心吧。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章