在乙個劃分成網格的操場上,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 如 表示 比 高。請編一程式,根據所得到的比較結果求出一種符合條件的排隊方案。注 比較結果中沒有...