士兵站隊問題

2021-10-16 02:34:28 字數 971 閱讀 5164

題解:

首先已知縱向移動可以直接通過求中位數得到

那麼問題就是橫方向移動了

我們假設第一位士兵站的位置是k,因為x從x1開始,那麼我們假設成起始位置為k+1吧(不懂接著看完你就懂了)

那麼:第二位士兵的位置是 k+2,接著是k+3,k+4,……,k+n;

所以,士兵橫向(即平行於y軸方向)移動的距離為:

|x1-(k+1)|+|x2-(k+2)|+|x3-(k+3)|+……+|x(n-1)-(k+n-1)|+|xn-(k+n)|
那麼k取何值會使上式最小?我們不妨變形一下:

|(x1-1)-k)|+|(x2-2)-k)|+|(x3-3)-k)|+……+|(x(n-1)-(n-1))-k)|+|(xn-n)-k)|
//x(n-1)中 n-1 是x的下標

最後就是求中位數了

wa因:沒有考慮路徑重疊時的最短情況

#include

#include

#include

using

namespace std;

int x[

20000

],y[

20000];

intmain()

sort

(x+1

,x+n+1)

;sort

(y+1

,y+n+1)

;for

(i=1

; i<=n; i++

) x[i]

=x[i]

-i;sort

(x+1

,x+n+1)

; xx=x[

(n+1)/

2]; yy=y[

(n+1)/

2]; t=0;

for(i=

1; i<=n; i++

) cout<}

士兵站隊問題

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

9209 士兵站隊問題

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

2 2 9 士兵站隊問題

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