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。

列舉最小值到最大值,高於削去,低於補上,min比較答案

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>

#define N 1000+7
using namespace std;

inline int sqr(int x)
{
	return x*x;
}
int n,ma=0,mi=1000+7;
int aans=200000000+9,ans;
int a[N];
int main()
 {
 	scanf("%d",&n);
 	for(int i=1;i<=n;i++)
 	 {
 	 	scanf("%d",&a[i]);
 	 	ma=max(ma,a[i]);
 	 	mi=min(mi,a[i]);
	  }
	
	for(int j=mi;j<=ma;j++)
	 {
	 	ans=0;
	 	 for(int i=1;i<=n;i++)
	 	  {
	 	  	if(a[i]-17>j)ans+=sqr(a[i]-j-17);
	 	  	 else if(j>a[i])ans+=sqr(a[i]-j);
		   }
		aans=min(aans,ans);   
	   }  
	printf("%d",aans);   
 }

輸入輸出樣例

輸入樣例#1: 複製

5
20
4
1
24
21

輸出樣例#1: 複製

18

說明

約翰保持高度為4、20和21的山的高度。他增高高度為1的山、變成高度4(花費 3 ^ 2 = 9)。他降低了高度為24的山變成高度21也花費3 ^ 2 = 9。