题目来源: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
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); } }