2021寒假每日一題《滑雪場設計》

棋盤挑戰

題目來源:USACO 2014 January Contest Bronze
時間限制:\(1000ms\) 內存限制:\(64mb\)java

題目描述

農夫約翰的農場上有 \(N\) 個山丘,每座山的高度都是整數。
在冬天,約翰常常在這些山上舉辦滑雪訓練營。
不幸的是,從明年開始,國家將實行一個關於滑雪場的新稅法。
若是滑雪場的最高峯與最低峯的高度差大於17,國家就要收稅。
爲了不納稅,約翰決定對這些山峯的高度進行修整。
已知,增長或減小一座山峯 \(x\) 單位的高度,須要花費 \(x^2\) 的金錢。
約翰 只願意改變整數單位 的高度。
請問,約翰最少須要花費多少錢,纔可以使得最高峯與最低峯的高度差不大於17。數組

輸入格式

第一行包含整數 \(N\) 。
接下來 \(N\) 行,每行包含一個整數,表示一座山的高度。ide

輸出格式

輸出一個整數,表示最少花費的金錢。內存

數據範圍

\(1 ≤ N ≤ 1000\)
數據保證,每座山的初始高度都在 \(0∼100\) 之間。input

樣例輸入

5
20
4
1
24
21

樣例輸出

18

樣例解釋

最佳方案爲,將高度爲 \(1\) 的山峯,增長 \(3\) 個單位高度,將高度爲 \(24\) 的山峯,減小 \(3\) 個單位高度。it

解題思路:枚舉

拿到給定的山高度的數組以後,
由於每座山的初始高度都在 \(0∼100\) 之間。
因此設置一個山的最小標準 \(i\) ,從 \(0\) 開始,到 \(100-17\) 之間,也就是 \(i \in [0,83)\) ,
將 \(i\) 設置爲一個最小標準,全部山比最小標準矮的,進行增高,
將 \(i+17\) 設置爲最大標準,全部山比最大標準高的,將其變矮。class

枚舉全部狀況,取花費最小的一項,即得題解。test

解題代碼-Java

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        int[] mountains = new int[n];
        for (int i = 0; i < n; i++) {
            mountains[i] = input.nextInt();
        }
        input.close();
        int ans = Integer.MAX_VALUE;  //給答案賦一個很大的初始值
        for (int i = 0; i < 100 - 17; i++) {  //以 [i,i+17] 爲山的高度區間,枚舉全部可能
            int w = 0;
            for (int j = 0; j < n; j++) {
                if (mountains[j] < i) {  //若山的高度不在區間內,則計算須要花費的金錢
                    w += Math.pow(mountains[j] - i, 2);
                } else if (mountains[j] > i + 17) {
                    w += Math.pow(mountains[j] - i - 17, 2);
                }
            }
            ans = Math.min(ans, w);  //枚舉全部的狀況,取花費金錢最小的值做爲答案。
        }
        System.out.println(ans);
    }
}
相關文章
相關標籤/搜索