1. 程式人生 > >洛谷 P3650 [USACO1.3]滑雪課程設計Ski Course Design

洛谷 P3650 [USACO1.3]滑雪課程設計Ski Course Design

scanf sign nbsp 整數 單位 std sig inline 說明

題目描述

農民約翰的農場裏有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。

【分析】

依舊是枚舉,不多說了。

【代碼】

 1 #include <bits/stdc++.h>
 2 #define inf 0x7fffffff
 3 using namespace std;
 4 
 5 int n, h[1005
], ans=inf, tot; 6 7 inline int read() { 8 int x=0, w=1; 9 char ch=0; 10 while (ch<0 || ch>9) { 11 if (ch==-) 12 w=-1; 13 ch=getchar(); 14 } 15 while (ch>=0 && ch<=9) 16 x=(x<<3)+(x<<1)+ch-0, ch=getchar();
17 return x*w; 18 } 19 20 int main() { 21 cin >> n; 22 for (int i=1;i<=n;++i) scanf("%d", &h[i]); 23 for (int i=0;i<=100;++i) { 24 tot=0; 25 for (int j=1;j<=n;++j) 26 if ((h[j]<i && i-h[j]>17)) 27 tot+=(i-h[j]-17)*(i-h[j]-17); 28 else if (h[j]>i) 29 tot+=(h[j]-i)*(h[j]-i); 30 ans=min(tot, ans); 31 } 32 cout << ans << endl; 33 }

洛谷 P3650 [USACO1.3]滑雪課程設計Ski Course Design