free pascal 解士兵站队问题

来源:百度知道 编辑:UC知道 时间:2024/06/20 20:32:07
士兵站队问题
«问题描述:
在一个划分成网格的操场上,n个士兵散乱地站在网格点上。网格点由整数坐标(x,y)表示。士兵们可以沿网格边上、下、左、右移动一步,但在同一时刻任一网格点上只能有一名士兵。按照军官的命令,士兵们要整齐地列成一个水平队列,即排列成(x,y),(x+1,y),…,(x+n-1,y)。如何选择x和y的值才能使士兵们以最少的总移动步数排成一列。
希望大牛们可以指点一下...注意用free pascal

type sj=array[1..10001]of longint;
var
x,y:array[1..10001]of longint;
i,mid,step,n,a,min:longint;
procedure px(l,r:longint; var y:sj);
var i,j,m,t:longint;
begin
i:=l; j:=r; m:=y[(l+r)div 2];
repeat
while y[i]<m do inc(i);
while y[j]>m do dec(j);
if i<=j then
begin
t:=y[i]; y[i]:=y[j]; y[j]:=t;
inc(i); dec(j);
end;
until i>j ;
if l<j then px(l,j,y);
if r>i then px(i,r,y);
end;
begin
readln(n);
for i:=1 to n do
read(x[i],y[i]);
px(1,n,y);
mid:=y[n div 2+1];
step:=0;
for i:=1 to n do
step:=step+abs(y[i]-mid);
px(1,n,x);
for i:=1 to n do
x[i]:=x[i]-i+1;
px(1,n,x);
mid:=x[n div 2+1];
for i:=1 to n do
step:=step+abs(x[i]-mid);
writeln(step);
end.

pascal编译器都没有什么区别

用贪心算法就可以了