洛谷 P3650 [USACO1.3]滑雪課程設計Ski Course Design
阿新 • • 發佈:2017-08-31
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