7 士兵排隊 PTA(排序 中位數)(C )

2021-10-03 07:43:58 字數 2756 閱讀 7171

在乙個劃分成網格的操場上,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。

乙個資料,即士兵排成一行需要的最少移動步數。

512

2213

3-23

3

8
根據題意,要求所有士兵的最小移動步數,首先要找出他們需要站成的水平佇列的第乙個座標(x,y)。

求該點的縱座標y:只需將所有士兵的座標按照由小到大的順序排列,他們縱座標的中位數即為所求點的縱座標y。

求該點的橫座標x:

問題解釋:

1.為什麼縱向上y為y1,y2,…, yn的中位數?

中位數的性質:所有數與中位數的絕對差之和最小

性質的簡單證明:

首先,給定乙個從小到大的數列x1,x2,…,xn,設x是x1到xn與其絕對差之和最小的數,即( |x1-x|+|x2-x|+…|xn-x| )min=x。則顯然x是位於x1和xn之間的。那麼,由於x1,xn與它們之間任何一點的距離之和都相等且都等於xn-x1,即( |x1-xi|+|xn-xi| )=xn-x1。因此x一定不是x1或xn,進而考慮剩下的x2到x[n-1]的數,同樣顯然x不是x2或x[n-1]而是位於x2和x[n-1]之間。依此類推,最後得出的結論就是x是這個數列最中間的那個數,或者是中間的那兩個數,而根據中位數的定義可知,x就是y0,y1,…,yn這個數列的中位數。

**實現:

int rey;

sort

(y+1

,y+n+1)

;if(n%2!=0

) rey =

(y[n/2]

+y[n/2+

1])/

2;else

rey = y[n/2+

1];

2.x的取值:

由於又可能兩位士兵的橫座標是相同的,所以x的取值不同於y取值的原理。那到底該怎麼求x呢?

首先,我們知道要使所有士兵的移動步數之和最小,那麼每個士兵都應該移動到離自己最近的佇列位置,但又不能插隊,所以第乙個士兵應該移動進佇列的第乙個位置,第二個士兵移動進入佇列的第二個位置…

設每個士兵的橫座標按由小到大排序後為x0,x1,…,xn。所以,可以得出所有士兵在x方向上的移動步數為|x0-x|+|x1-(x+1)|+…+|xn-1-(x+n-1)|,該式子變形之後得|x0-x|+|(x1-1)-x|+…+|(xn-1-(n-1))-x|。可以發現,要使這個式子結果最小,則x是x0,x1-1,…,xn-1-(n-1)的中位數。

**實現:

int rex;

sort

(x+1

,x+n+1)

;for

(int i=

1;i<=n;i++

) x[i]

=x[i]-1

;sort

(x+1

,x+n-1)

;if(n%2!=0

) rex =

(x[n/2]

+x[n/2+

1])/

2;else

rex = x[n/2+

1];

3.由此就可以找出水平佇列的第乙個座標(x,y),然後根據第乙個士兵移動進入佇列的第乙個位置,第二個士兵移動進入第二個位置,…,計算出最小移動步數並輸出。

4.如何求中位數?

數列a1~an

中位數x=a[n/2]=sort( a+1 , a+1+n );

5.部分庫函式的呼叫:

(1)sort()函式

sort函式用於c++中,對給定區間所有元素進行排序,預設為公升序。

sort函式進行排序的時間複雜度為n*log2n,比冒泡之類的排序演算法效率要高,sort函式包含在標頭檔案為#include的c++標準庫中。

sort(start,end,cmp);

(2)abs函式

abs函式可用於c、c++、vb、matlab等等,是求整數的絕對值。

在c語言中abs函式包含在標頭檔案為stdlib.h中;在c++中abs函式包含在cstdlib中。

#include

#include

//sort函式

#include

//abs函式

using

namespace std;

intmain()

else

//n為奇數

//下面計算最小移動步數

for(i=

1;i<=n;i++

) sum +

=abs

(x[i]

-rex)

+abs

(y[i]

-rey)

;printf

("%d"

,sum)

;//輸出結果

return0;

}

中位數 排序

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

士兵排隊問題 拓撲排序

演算法提高 士兵排隊問題 時間限制 1.0s 記憶體限制 256.0mb 試題 有 個士兵 1 26 編號依次為 佇列訓練時,指揮官要把一些士兵從高到矮一次排成一行,但現在指揮官不能直接獲得每個人的身高資訊,只能獲得 p1比p2高 這樣的比較結果 p1 p2 記為 p1 p2 如 表示 比 高。請編...

中位數 士兵站隊 nkoj 3551

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