The aim of this puzzle, is to minimize the length of cable used to connect a business park to the network, given the coordinates of all the building. There must be a main horizontal cable, and for each building a dedicated vertical cable from the building to the main cable.
If there are A buildings above it and B buildings below it, shifting it up increases the total length of vertical cables by B-A, and shifting it down increases this number by A-B. So to minimize the length:
Finally, the optimal positions for the main cable are the positions where A = B. That is why, the y-coordinate of the main cable must be a median of the set of y-coordinates of the building.
Once the array Ys of the y-coordinates of the N buildings, sorted (once again thanks to qsort, but you could use your own sorting function), the median is simply Ys[N/2].
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>
/* Comparison function between two long long integers
return -1 if a<b, 1 if a>b, 0 if a=b */
int cmp (const void * a, const void * b){
long long aa = *(long long*)a;
long long bb = *(long long*)b;
return aa<bb?-1:aa>bb?1:0;
}
int main()
{
int N;
scanf("%d", &N);
long long xMin = LLONG_MAX;
long long xMax = 0LL;
long long x;
long long Ys[N];
// reading coordinates, storing Ys, computing xMin and xMax
for (int i = 0; i < N; i++) {
long x;
scanf("%Ld %Ld", &x, Ys+i);
if (x < xMin) xMin = x;
if (x > xMax) xMax = x;
}
// sorting Ys in ascending order
qsort(Ys, N, sizeof(long long), cmp);
/* The main horizontal cable length is xMax-xMin
To minimize the total length of vertical cables, its
y-coordinate of the main cable must be a median of Ys, Ys[N/2]*/
long long res = xMax-xMin;
for (int i = 0 ; i < N ; i++)
res += abs(Ys[N/2]-Ys[i]);
printf("%Ld\n", res);
}