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