USACO-Section1.3 Ski Course Design [模擬]
阿新 • • 發佈:2019-02-20
2017-6-2
題目大意
農民約翰的農場裡有N座山峰(1<=N<=1000),每座山都有一個在0到100之間的整數的海拔高度。因為在冬天山上有豐富的積雪,所以約翰經常開辦滑雪訓練營。
不幸的是,約翰剛剛得知稅法在滑雪訓練營方面有新變化,明年開始實施。在仔細閱讀法律後,他發現如果滑雪訓練營的最高和最低的山峰海拔高度差大於17就要收稅。因此,如果他改變山峰的高度(使最高與最低的山峰海拔高度差不超過17),就可以避免支付稅收。
如果改變一座山x單位的高度成本是x^2單位,約翰最少需要付多少錢?約翰只願意改變整數單位的高度。農民約翰的農場裡有N座山峰(1<=N<=1000),每座山都有一個在0到100之間的整數的海拔高度。因為在冬天山上有豐富的積雪,所以約翰經常開辦滑雪訓練營。
不幸的是,約翰剛剛得知稅法在滑雪訓練營方面有新變化,明年開始實施。在仔細閱讀法律後,他發現如果滑雪訓練營的最高和最低的山峰海拔高度差大於17就要收稅。因此,如果他改變山峰的高度(使最高與最低的山峰海拔高度差不超過17),就可以避免支付稅收。
如果改變一座山x單位的高度成本是x^2單位,約翰最少需要付多少錢?約翰只願意改變整數單位的高度。
題解
山的高度範圍只有0~100, 所以我們可以在[0, 100]的範圍內列舉長度為17的區間,區間之外的山都需要改變高度到區間的端點處。
程式碼
/*
ID: zachery1
PROG: skidesign
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <cstring>
#define MAXH 110
#define INF 0x3f3f3f3f
#define POW2(x) ((x)*(x))
#define cin fin
#define cout fout
using namespace std;
ifstream fin("skidesign.in");
ofstream fout("skidesign.out");
int N, ans = INF;
long long hill[MAXH];
int main() {
cin >> N;
memset(hill, 0, sizeof(hill));
for (int i = 0; i < N; i++) {
int high;
cin >> high;
hill[high]++;
}
for (int i = 0; i <= 83; i++) {
int mass = 0;
for (int j = 0; j < i; j++) {
mass += hill[j] * POW2(i-j);
}
if (mass == 0 && hill[i] == 0) continue;
int shorten = 0;
for (int j = i+17+1; j <= 100; j++) {
shorten += hill[j] * POW2(j-i-17);
}
ans = min(ans, mass + shorten);
}
cout << ans << endl;
return 0;
}