UVa 10041 - Vito's Family
【原题】
Background
The world-known gangster Vito Deadstone is moving to New York. He has a very big family there, all of them living in Lamafia Avenue. Since he will visit all his relatives very often, he is trying to find a house close to them.
Problem
Vito wants to minimize the total distance to all of them and has blackmailed you to write a program that solves his problem.
Input
The input consists of several test cases. The first line contains the number of test cases.
For each test case you will be given the integer number of relatives r ( 0 < r < 500) and the street numbers (also integers) where they live ( 0 < si < 30000 ). Note that several relatives could live in the same street number.
Output
For each test case your program must write the minimal sum of distances from the optimal Vito's house to each one of his relatives. The distance between two street numbers si and sj is dij= |si-sj|.
Sample Input
2
2 2 4
3 2 4 6
Sample Output
2
4
【题目大意】
一个易做图老大要搬家到纽约的某一条街上, 他在那条街上有很多的亲戚朋友,要找到一个地方,使得这个地方走到所有亲戚朋友家的总距离最短。
【分析与总结】
易做图裸的找中位数就OK了...
【代码】
[cpp]
/*
* UVa: 10041 Vito's Family
* Time: 0.024s
* Author: D_Double
*
*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#define MAXN 510
using namespace std;
int arr[MAXN], n;
void solve(){
sort(arr, arr+n);
if(n&1){ //如果是奇数,一定是正中间那个数
int mid=arr[(n-1)>>1];
int sum=0;
for(int i=0; i<n; ++i)
sum += abs(arr[i]-mid);
printf("%d\n",sum);
}
else{ //如果是偶数,那么是中间两个之和的一半
int mid=(arr[(n-2)>>1]+arr[n>>1])/2;
int sum=0;
for(int i=0; i<n; ++i)
sum += abs(arr[i]-mid);
printf("%d\n", sum);
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=0; i<n; ++i)
scanf("%d",&arr[i]);
solve();
}
return 0;
}
补充:软件开发 , C++ ,