2021寒假每日一题《滑雪场设计》

棋盘挑战

题目来源:USACO 2014 January Contest Bronze
时间限制: 1000 m s 1000ms 1000ms 内存限制: 64 m b 64mb 64mb

题目描述

农夫约翰的农场上有 N N N 个山丘,每座山的高度都是整数。
在冬天,约翰经常在这些山上举办滑雪训练营。
不幸的是,从明年开始,国家将实行一个关于滑雪场的新税法。
如果滑雪场的最高峰与最低峰的高度差大于17,国家就要收税。
为了避免纳税,约翰决定对这些山峰的高度进行修整。
已知,增加或减少一座山峰 x x x 单位的高度,需要花费 x 2 x^2 x2 的金钱。
约翰 只愿意改变整数单位 的高度。
请问,约翰最少需要花费多少钱,才能够使得最高峰与最低峰的高度差不大于17。

输入格式

第一行包含整数 N N N
接下来 N N N 行,每行包含一个整数,表示一座山的高度。

输出格式

输出一个整数,表示最少花费的金钱。

数据范围

1 ≤ N ≤ 1000 1 ≤ N ≤ 1000 1N1000
数据保证,每座山的初始高度都在 0 ∼ 100 0∼100 0100 之间。

样例输入

5
20
4
1
24
21

样例输出

18

样例解释

最佳方案为,将高度为 1 1 1 的山峰,增加 3 3 3 个单位高度,将高度为 24 24 24 的山峰,减少 3 3 3 个单位高度。

解题思路:枚举

拿到给定的山高度的数组之后,
因为每座山的初始高度都在 0 ∼ 100 0∼100 0100 之间。
所以设置一个山的最小标准 i i i ,从 0 0 0 开始,到 100 − 17 100-17 10017 之间,也就是 i ∈ [ 0 , 83 ) i \in [0,83) i[0,83)
i i i 设置为一个最小标准,所有山比最小标准矮的,进行增高,
i + 17 i+17 i+17 设置为最大标准,所有山比最大标准高的,将其变矮。

枚举所有情况,取花费最小的一项,即得题解。

解题代码-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);
    }
}

你可能感兴趣的:(2021寒假每日一题,java,算法,枚举类)