士兵站位問題soliders

2021-08-20 03:29:19 字數 1108 閱讀 1888

在乙個劃分成網格的操場上,n個士兵散亂地站在網格點上。網格點由整數座標(x,y)表示。士兵們可以沿網格邊上、下、左、右移動一步,但在同一時刻任一網格點上只能有一名士兵。按照軍官的命令,士兵們要整齊地列成乙個水平佇列,即排列成(x,y),(x+1,y),…,(x+n-1,y)。如何選擇x 和y的值才能使士兵們以最少的總移動步數排成一列。 計算使所有士兵排成一行需要的最少移動步數。

輸入

第1 行是油井數n,1< =n< =10000。接下來n 行是油井的位置,每行2個整數x和y,-10000< =x,y< =10000。
輸出
第1 行中的數是士兵排成一行需要的最少移動步數。

樣例輸入

5

1 22 2

1 33 -2

3 3

樣例輸出
8

解題思路:這道題其實跟郵局選址問題和油管問題很像,需要注意的是x方向的最近距離,士兵需要按照順序站位,因此第乙個士兵的移動距離是|x1-x|,第二個士兵的移動距離是|x2-x-1|,即到最優點x的鄰近點的位置,因此總距離為|x1-x|+|x2-x-1|+|x3-x-2|+...+|xn-n-n+1|,因此可求得最優點的x座標為x1,x2-1...xn-n+1的中間值。

**如下:

#include#include #include #include #includeusing namespace std;

#define n 10005

struct soldier

soldier[n],b[n];

int n,sum=0;

bool cmpx(const soldier& a,const soldier& b)

memcpy(b,soldier,sizeof(b));

sort(soldier,soldier+n,cmpy);

py=soldier[n/2].y;

sort(b,b+n,cmpx);

for(int i=0;isort(b,b+n,cmpx);

px=b[n/2].x;

sort(soldier,soldier+n,cmpx);

for(int i=0;icout

}

士兵站隊問題

問題描述 在乙個劃分成網格的操場上,n個士兵散亂地站在網格點上,網格點由整數座標 x,y 表示。士兵們可以沿網格邊上 下 左 右移動一步,但在同一時刻任一網點上只能有一名士兵。按照軍官的命令,士兵們要整齊地列成乙個水平佇列,即排列成 x,y x 1,y x n,y 如何選擇x和y的值才能使士兵們以最...

士兵站隊問題

題解 首先已知縱向移動可以直接通過求中位數得到 那麼問題就是橫方向移動了 我們假設第一位士兵站的位置是k,因為x從x1開始,那麼我們假設成起始位置為k 1吧 不懂接著看完你就懂了 那麼 第二位士兵的位置是 k 2,接著是k 3,k 4,k n 所以,士兵橫向 即平行於y軸方向 移動的距離為 x1 k...

9209 士兵站隊問題

time limit 10 second memory limit 2 mb 問題描述 在乙個劃分成網格的操場上,n個士兵散亂地站在網格點上。網格點由整數座標 x,y 表示。士兵們可以沿網格邊上 下 左 右移動一步,但在同一時刻任一網格點上只能有一名士兵。按照軍官的命令,士兵們要整齊地列成乙個水平佇...