分治法 士兵排隊問題

2022-08-09 05:54:10 字數 1804 閱讀 7650

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

輸出格式:

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

輸入樣例:

5

1 2

2 2

1 3

3 -2

3 3

輸出樣例:

8
x軸和y軸可以分開考慮。

士兵y軸座標不變,可以假想為有一條垂直於y軸的直線,所有士兵都要移動到這條直線上,顯然這是乙個求中位數y的問題。解決方法為將士兵y軸座標排序,求得中位數後求各士兵y軸座標據其的距離abs(y[i] - y)

(排序不需要寫了吧,我這裡用的是快排

至此,在我們的假設中所有士兵已經移動到了同一水平線上,那麼x軸的呢……有了y軸的思路,x軸應該也比較容易想到,它仍是乙個求中位數的問題。

我們先對士兵x軸座標進行排序,假設排序完他們座標x0,x1,x2……x(n - 1),而最終座標為x,x+1,x+2……x+(n - 1),那麼移動步數也就是(x0 - x) + (x1 - x -1) + …… + (x(n - 1) - x - n)= (x0 - x) + ((x1 - 1) - x) + ((x2 - 2) - x) + …… + ((x(n - 1) - (n - 1) - x) 現在它已經轉化為了求 x0,x1 - 1,x2 - 2……x(n - 1) - (n - 1)的中位數

#include #include int x[10000], y[10000], s[10000];

void quicksort(int l, int r, int *data)

}//迴圈結束表示一趟已執行完

if(l < j)

quicksort(l, j, data);

if(r > i)

quicksort(i, r, data);

}int main()

//y軸方向上的考慮

quicksort(0, n - 1, y);

if(n % 2)

y = y[(n - 1) / 2];

else y = (y[n / 2] + y[n / 2 - 1]) / 2;

for(int i = 0; i < n; i++)

//x軸方向上的考慮

quicksort(0, n - 1, x);

for (int i = 0; i < n; i++)

quicksort(0, n - 1, s);

if(n % 2)

x = s[(n - 1) / 2];

else x = (s[n / 2] + s[n / 2 - 1]) / 2;

for(int i = 0; i < n; i++)

printf("%d", res);

return 0;

}

分治演算法 士兵排隊(poj1723)

問題描述 在乙個劃分成網格的操場上,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 如 表示 比 高。請編...

ADV 169 士兵排隊問題

試題 有 個士兵 1 26 編號依次為 佇列訓練時,指揮官要把一些士兵從高到矮一次排成一行,但現在指揮官不能直接獲得每個人的身高資訊,只能獲得 p1比p2高 這樣的比較結果 p1 p2 記為 p1 p2 如 表示 比 高。請編一程式,根據所得到的比較結果求出一種符合條件的排隊方案。注 比較結果中沒有...