10041. Семья Вито
У Вито большая семья в Нью-Йорке.
Он хочет поселиться на улице, суммарное расстояние от которой до улиц
проживания его родственников минимальна.
Вход. Первая
строка содержит количество тестов. Каждый тест задается одной строкой. Первое число
в строке содержит число родственников n
(0 < n < 500), за которым идут
номера их улиц s1, s2, …, sn (0 < si
< 30000). Расстояние между улицами с номерами si и sj
равно dij = |si – sj|. На одной улице могут проживать несколько
родственников.
Выход. Для каждого теста вывести минимальное
суммарное расстояние от улицы Вито до улиц его родственников.
3
2 2 4
3 2 4 6
3 3 1 7
Пример выхода
2
4
6
сортировка
Отсортируем
номера их улиц n родственников. Нумерацию
индексов улиц родственников будем вести с нуля: считаем, что входными номерами улиц являются
s0, s1, …, sn-1.
Если Вито поселится на улице x, то
суммарное расстояние от нее до родственников равно
f(x) = |x – s0| + |x – s1|
+ … + |x – sn-1|
Минимум
функции f(x) достигается при x = s[n/2]. Таким образом, Вито должен поселиться на улице с
номером s[n/2]. Вычислим суммарное расстояние от улицы s[n/2] до улиц si
(1 £ i £ n) и выведем его.
int m[500];
Для
каждого теста вводим значения входных данных, сортируем номера улиц
родственников (массив m). Вычислим сумму расстояний от оптимального номера
улицы Вито с номером s[n/2]
до всех остальных улиц и выведем ее.
scanf("%d",&tests);
while(tests--)
{
scanf("%d",&n);
for(i = 0; i
< n; i++) scanf("%d",&m[i]);
sort(m,m+n);
for(s = i =
0; i < n; i++)
s += abs(m[n/2]-m[i]);
printf("%d\n",s);
}