题目描述
农民约翰在他的农场有N个小山(1 <= N <= 1,000),每个都有0 ... 100的整数高程。在冬天,由于这些山丘上有丰富的雪,FJ经常进行滑雪训练营。
不幸的是,FJ刚刚发现将在明年在用作滑雪训练营的农场进行评估的新税收。然而,仔细阅读法律后,他发现,滑雪场的官方定义要求他的财产的最高和最低的山差别严格大于17.因此,如果他缩短最高的山丘,并增加质量增加较短的山丘的高度,FJ可以避免缴纳税款,只要最高和最低的山脉之间的新差距最多为17。
如果用x ^ 2单位的钱来改变一个山的高度x单位,FJ需要支付的最低金额是多少? FJ只能改变一个山的高度一次,所以每个山的总成本是其原始高度和最终高度之间的差的平方。 FJ只愿意把每个山丘的高度改变一个整数。
程序名称:skidesgin
输入格式
第1行:整数N.
第2..1 + N行:每行包含单个山丘的高程。
输入 (file skidesgin.in)
5 20 4 1 24 21
输入注释:
FJ的农场有5个山丘,海拔1,4,20,21和24。
输出格式
第1行:FJ需要支付的最小金额来修改山丘的高度,所以最大和最小之间的差异最多为17个单位。
输出(file skidesgin.out)
18
输出注释:
FJ保持高度4,20和21的山峦。 他向高度1的山丘增加质量,使其达到高度4(成本= 3 ^ 2 = 9)。 他把高度24的山降低到21,也就是3 ^ 2 = 9。
解题代码
/*
ID: 15189822
PROG: skidesign
LANG: C++
*/
#include<iostream>
#include<algorithm>
#include<fstream>
using namespace std;
const int N = 1000;
int x[N+1],n;
ifstream fin("skidesign.in");
ofstream fout("skidesign.out");
int res(int t){
int s=0;
for (int i=1;i<=n;i++){
if (x[i]<t&&t-x[i]>8) s+=(t-x[i]-8)*(t-x[i]-8);
else if (x[i]>t&&x[i]-t>9) s+=(x[i]-t-9)*(x[i]-t-9);
}
return s;
}
int main(){
int r=0x3f3f3f3f;
fin>>n;
for (int i=1;i<=n;i++){
fin>>x[i];
}
sort(x+1,x+n);
if(x[n]-x[1]<=17) fout<<"0"<<endl;
else{
for (int i=8;i<=N-9;i++){
r=min(res(i),r);
}
fout<<r<<endl;
}
return 0;
}