1870: 马拉松后记
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 57 Solved: 22
Submit Status Web Board
Description
毛毛雨学姐跑完了半程马拉松,接下来决定去参加山地越野赛了,主办方听说毛毛雨学姐是一位ACMer,就想让她来帮忙解决一下
赛场问题:已知在山地越野场地有N座土坡(1<=N<=1000),每座土坡都有一个在0到100之间的整数海拔,考虑到参赛选手
大多都是业余选手,所以主办方决定将土坡的高度差限定在17米(即最高和最低相差不超过17米),然而想改变一座土坡x米需
要花费x^2元(改变只能是整数x米),请你们帮助毛毛雨学姐来计算出主办方最少的支出。
Input
第一行:一个整数N
第二行至第N+1行:每座土坡的高度
多组测试样例
Output
主办方的最少支出
Sample Input
542012124
Sample Output
18
解题思路:对于这道题,因为高度范围比较小(0--100),山坡数量也比较小,所以可以通过枚举最大高度,
比最大高度大的就减去,比它小,且相差大于17的就加上。暴力枚举。
代码如下:
#include<stdio.h>
#include<algorithm>
using namespace std;
int num[1010];
int n;
long long cost(int d){
int i;
long long sum;
sum=0;
for(i=0;i<n;i++){
if(num[i]>d){
sum+=(num[i]-d)*(num[i]-d);
}
else if(d-num[i]>17){
sum+=(d-17-num[i])*(d-17-num[i]);
}
}
return sum;
}
int main(){
int i,j;
long long sum;
while(scanf("%d",&n)!=EOF){
sum=0x3f3f3f3f;
for(i=0;i<n;i++)
scanf("%d",&num[i]);
sort(num,num+n);
for(i=num[n-1];i>=num[0];i--){
sum=min(sum,cost(i));
}
printf("%lld\n",sum);
}
return 0;
}