1. 程式人生 > >P3650 [USACO1.3]滑雪課程設計Ski Course Design(暴力)

P3650 [USACO1.3]滑雪課程設計Ski Course Design(暴力)

題目描述

農民約翰的農場裡有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;
}