题目描述
农民约翰在他的农场有N座山峰(1 <= N <= 1,000),每座山峰的海拔为0到100之间的整数。在冬天,由于这些山上有大量的积雪,约翰经常开办滑雪训练营。
不幸的是,约翰刚刚得知税法在滑雪训练营方面有新变化,明年开始实施。在仔细阅读法律后,他发现如果滑雪训练营的最高和最低的山峰海拔高度差大于17就要收税。因此,如果他改变山峰的高度(使最高与最低的山峰海拔高度差不超过17),约翰可以避免支付税收。
如果改变一座山x单位的高度成本是x^2单位,约翰最少需要付多少钱?
约翰只能改变一次山丘的高度,且每次改变整数单位的高度。
输入格式
第1行: 整数N.表示山峰的数量
第二行到N+1行:每行是一座山的海拔高度
输出格式
约翰需要支付修改山的海拔高度的最少总金额,使得最高和最低的山峰间高度差最多17。
输入输出样列
输入样例1:
5
20
4
1
24
21
输出样例1:
18
说明
样例说明:
输入,约翰有5座山,山的高度分别为20、4、1、24、21
最终,高度为4、20、21的这三座山高度没有动,约翰把高度为1的山,增高为4,花费是3 ^ 2 = 9,把高度为24的山,降低为21,花费也是3 ^ 2 = 9。所以总花费是18,输出18
【耗时限制】1000ms 【内存限制】128MB
题目代码:
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<sstream>
using namespace std;
int a[1010];
int main()
{
int n,minn=100,maxn=-1,sum;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
maxn=max(maxn,a[i]);
minn=min(minn,a[i]);
}
int ss=0x3f3f3f;
for(int i=minn;i<=maxn;i++)
{
sum=0;
for(int j=1;j<=n;j++)
{
if(a[j]>i) sum+=pow(a[j]-i,2);
else if(i-a[j]>17) sum+=pow(i-a[j]-17,2);
}
ss=min(sum,ss);
}
cout<<ss;
return 0;
}
希望对您有所帮助!!!