P3650 [USACO1.3]滑雪課程設計Ski Course Design(暴力)
阿新 • • 發佈:2018-12-09
題目描述
農民約翰的農場裡有N座山峰(1<=N<=1000),每座山都有一個在0到100之間的整數的海拔高度。在冬天,因為山上有豐富的積雪,約翰經常開辦滑雪訓練營。
不幸的是,約翰剛剛得知稅法在滑雪訓練營方面有新變化,明年開始實施。在仔細閱讀法律後,他發現如果滑雪訓練營的最高和最低的山峰海拔高度差大於17就要收稅。因此,如果他改變山峰的高度(使最高與最低的山峰海拔高度差不超過17),約翰可以避免支付稅收。
如果改變一座山x單位的高度成本是x^2單位,約翰最少需要付多少錢?約翰只願意改變整數單位的高度。
輸入輸出格式
輸入格式:
第一行:一個整數n
第二行到N+1行:每行是一座山的海拔高度
輸出格式:
約翰需要支付修改山海拔高度的總金額,最高和最低的山峰間高度差最多17。
輸入輸出樣例
輸入樣例#1: 複製
5 20 4 1 24 21
輸出樣例#1: 複製
18
說明
約翰保持高度為4、20和21的山的高度。他增高高度為1的山、變成高度4(花費 3 ^ 2 = 9)。他降低了高度為24的山變成高度21也花費3 ^ 2 = 9。
通過列舉最小的峰值,對於每個最小的峰值,來對每個已知的山峰判斷,差值大於17的減去,小於最小峰的補齊。
對於每個最小峰值都有一個花費總額sum,最後求最小的那個sum。
#include <iostream> #include<algorithm> #include<cmath> using namespace std; int ans=1e9+1; int a[1001]; int main() { int n; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; } sort(a,a+n); int sum; for(int i=a[0];i<=a[n-1];i++)//當前的最小峰值 { sum=0; for(int j=0;j<n;j++) { if(a[j]-i>17) sum+=(a[j]-i-17)*(a[j]-i-17); if(a[j]<i) sum+=(i-a[j])*(i-a[j]); } ans=min(ans,sum); } cout<<ans<<endl; return 0; }