AcWing寒假每日一題——Day17滑雪場設計
阿新 • • 發佈:2021-01-26
技術標籤:2021AcWing每日一題打卡演算法
1353滑雪場設計
一、問題描述
農夫約翰的農場上有
N
N
N 個山丘,每座山的高度都是整數。在冬天,約翰經常在這些山上舉辦滑雪訓練營。不幸的是,從明年開始,國家將實行一個關於滑雪場的新稅法。如果滑雪場的最高峰與最低峰的高度差大於17,國家就要收稅。為了避免納稅,約翰決定對這些山峰的高度進行修整。已知,增加或減少一座山峰
x
x
x 單位的高度,需要花費
x
2
x^2
x2 的金錢。約翰只願意改變整數單位的高度。請問,約翰最少需要花費多少錢,才能夠使得最高峰與最低峰的高度差不大於17。
輸入格式
第一行包含整數
N
N
N 。接下來
N
N
N 行,每行包含一個整數,表示一座山的高度。
輸出格式
輸出一個整數,表示最少花費的金錢。
資料範圍
1≤
N
N
N≤1000,資料保證,每座山的初始高度都在 0∼100 之間。
輸入樣例:
5
20
4
1
24
21
輸出樣例:
18
樣例解釋
最佳方案為,將高度為 1 的山峰,增加 3 個單位高度,將高度為 24 的山峰,減少 3 個單位高度。
二、問題分析
由題目知,最終山峰所在的高度區間只可能在
[
0
,
100
]
[0,100]
[0,100]之間,我們只需要將
[
0
,
100
]
[0,100]
[0,100]之中的83個長度為17的區間列舉一遍找到哪個區間的所花錢數最少即可。
程式碼如下(示例):
#include <iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int N,q[1010];
int main()
{
cin>>N;
for(int i=0;i<N;i++)cin>>q[i];
int res=1e9;
for(int i=0;i<=83;i++)
{
int sum=0,l=i,r=i+17;
for(int j=0;j<N;j++)
{
if (q[j]<l)sum+=pow((l-q[j]),2);//在區間左邊的加到右邊界
else if(q[j]>r)sum+=pow((q[j]-r),2);//在區間右邊的加到左邊界
}
res=min(sum,res);
}
cout<<res<<endl;
return 0;
}