1. 程式人生 > >USACO-Section1.3 Ski Course Design [模擬]

USACO-Section1.3 Ski Course Design [模擬]

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; }