Codevs P3625 士兵站队问题

来源:互联网 发布:me设计软件 编辑:程序博客网 时间:2024/04/28 05:38

3625 士兵站队问题


题目描述 Description

在一个划分成网格的操场上,n个士兵散乱地站在网格点上。网格点用整数坐标(x,y)表示。士兵们可以沿网格边往上、下、左、右移动一步,但在同一时刻任一网格点上只能有一名士兵。按照军官的命令,士兵们要整齐地列成一个水平队列,即排列成(x,y),(x+1,y),…,(x+n-1,y)。如何选择x和y的值才能使士兵们以最少的总移动步数排成一行。编程计算使所有士兵排成一行需要的最少移动步数。


输入输出


输入描述 Input Description

第1行是士兵数n,1≤n≤10000。接下来n行是士兵的初始位置,每行有2个整数x和y,-10000≤x,y≤10000。


输出描述 Output Description

一个数据,即士兵排成一行需要的最少移动步数。


样例


样例输入 Sample Input

5
1 2
2 2
1 3
3 -2
3 3


样例输出 Sample Output

8


数据范围及提示 Data Size & Hint

-10000≤x,y≤10000

分析

首先Y轴上肯定是到中位数最小,这样都走的是内部的直线距离,所以Y周直接求中位数即可,对于X轴,我们设到第一个人应到k位置,那么该式可表达为
ANS:=|x0-k|+|x1-(k+1)|+|x2-(k+2)|+|x3-(k+3)|+|x4-(k+4)|
转换一下形式
即ANS:=|(x0-0)-k|+|(x1-1)-k|+|(x2-2)-k|+|(x3-3)-k|+|(x4-4)-k|

所以我们可以求新序列的中位数新序列为b[i]:=a[i]-i+1;
最小值任然是中位数上取到。


代码如下

program soldiers;type ar=array[1..10000] of longint;var n,i,ans,t:longint;    x,y:ar;procedure qsort(l,r:longint;var g:ar);var i,j,mid,temp:longint;begin i:=l; j:=r; mid:=g[(i+j)>>1]; while i<=j do  begin   while g[i]<mid do inc(i);   while g[j]>mid do dec(j);   if i<=j    then     begin      temp:=g[i];      g[i]:=g[j];      g[j]:=temp;      inc(i);      dec(j);     end;  end; if i<r then qsort(i,r,g); if l<j then qsort(l,j,g);end;begin readln(n); for i:=1 to n do  readln(x[i],y[i]); qsort(1,n,y); ans:=0; for i:=1 to n do ans:=ans+abs(y[i]-y[(1+n) div 2]); qsort(1,n,x); for i:=1 to n do  begin   x[i]:=x[i]-i+1;  end; qsort(1,n,x); for i:=1 to n do ans:=ans+abs(x[i]-x[(1+n) div 2]); write(ans);end.

评测结果

测试点#sol0.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms
测试点#sol1.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms
测试点#sol10.in 结果:AC 内存使用量: 256kB 时间使用量: 5ms
测试点#sol2.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms
测试点#sol3.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms
测试点#sol4.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms
测试点#sol5.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms
测试点#sol6.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms
测试点#sol7.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms
测试点#sol8.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms
测试点#sol9.in 结果:AC 内存使用量: 256kB 时间使用量: 4ms


Daydream&Wishful

0 0
原创粉丝点击