1. 程式人生 > 其它 >AcWing寒假每日一題——Day17滑雪場設計

AcWing寒假每日一題——Day17滑雪場設計

技術標籤: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; }