Описание
N миротворцев из российского корпуса KFOR десантировались в окрестности аэропорта Слатина. Точка приземления каждого миротворца задается парой целочисленных координат (x,y). За один шаг каждый из десантников может переместиться на соседнюю целочисленную позицию вдоль оси X или Y (т.е. одна из его координат меняется на единицу по абсолютной величине). Шаги делаются по очереди, никакие два миротворца при этом не могут находиться в одной позиции одновременно

Задание
Десантники хотят выстроиться в шеренгу - линию, параллельную одной из осей координат, в которой они стояли бы в подряд идущих целочисленных позициях. Напишите программу, которая определяет минимальное суммарное число шагов, необходимое миротворцам для того, чтобы образовать шеренгу


Входные данные
Первая строка входного файла содержит целое число N - количество миротворцев (1
N10000). Каждая из последующих N строк содержит координаты десантника - два целых числа из диапазона [-32768,32767], разделенные пробелом

Выходные данные
Выведите в выходной файл искомое количество шагов


Например:

COMMANDO.IN
3
-1 -1
0 0
1 1


COMMANDO.OUT

2





Идеи
Вычислительная геометрия

Комментарии

Поскольку десантники могут перемещаться только вдоль координатных осей, то задачу можно решить отдельно по x-координатам и по y-координатам, а затем убедиться в том, что процесс перемещений можно организовать так, чтобы никакие два десантника ни в какой момент времени не находились бы в одной позиции. Тогда по одной координате мы должны за минимальное число ходов собрать десантников в одну точку, а по другой - выстроить в шеренгу

Занумеруем десантников, расположенных на оси, в порядке возрастания их координаты. Назовем центром ту точку, где стоит десантник номер N
div 2 + 1, если N нечетно, и любую точку между десантниками N div 2 и N div 2 + 1, если N четно. Тогда для сбора в одной точке следует выбрать любой из центров

Пусть мы выстроили десантников в шеренгу. Заметим, что их взаимное расположение не поменялось (если один десантник стоял левее другого, то после построения это сохранилось, иначе число ходов не минимально). Если вычесть из координаты каждого десантника его номер, то все они окажутся в одной точке. Следовательно, для решения задачи построения в шеренгу нужно вычесть из координаты каждого десантника его номер, собрать всех десантников в одну точку и затем прибавить номера обратно

Перебрав два случая - когда десантники по оси X собираются в точку, а по оси Y строятся в шеренгу, и наоборот, - выберем из них тот, который требует меньшего числа шагов


 



Решение

{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R-,S-,T-,V-,X-}
{$M 65384,0,655360}


program
commando;
const
nmax=5000;
type tarray=array[1..nmax] of longint;
var x,y:tarray;
    n:integer;
    m1,m2:longint;
 
procedure init;
var i:integer;
begin
  assign(input,'commando.in');
  reset(input);
  assign(output,'commando.out');
  rewrite(output);
  read(n);
  for i:=1 to n do
    read(x[i],y[i]);
end;
 
procedure sort(var m:tarray);
var i,j,g:integer;
    ttt:longint;
begin
  for i:=1 to n-1 do begin
    g:=i;
    for j:=i+1 to n do
      if m[j]then g:=j;
    ttt:=m[i];
    m[i]:=m[g];
    m[g]:=ttt;
    end;
end;
 
function scet(var a,b:tarray):longint;
var q:longint;
    m:integer;
    i:integer;
    c:tarray;
begin
  q:=0;
  m:=(n+1) div 2;
  for i:=1 to n do c[i]:=b[i]-i;
  sort(c);
  for i:=1 to n do begin
    q:=q+abs(c[i]-c[m]);
    q:=q+abs(a[i]-a[m]);
    end;
  scet:=q;
end;

begin

init;
sort(x);
sort(y);
  m1:=scet(x,y);
  m2:=scet(y,x);
  if m1>m2 then writeln(m2) else writeln(m1);
close(input);
close(output);
end.

 


© Особенности национальных задач по информатике