description
在乙個劃分成網格的操場上,n個士兵散亂地站在網格點上。網格點用整數座標(x,y)表示。
士兵們可以沿網格邊往上、下、左、右移動一步,但在同一時刻任一網格點上只能有一名士兵。按照軍官的命令,士兵們要整齊地列成乙個水平佇列,即排列成(x,y),(x+1,y),…,(x+n-1,y)。
如何選擇x和y的值才能使士兵們以最少的總移動步數排成一行。程式設計計算使所有士兵排成一行需要的最少移動步數。
input
輸入士兵數n,1<=n<=10000。
接下來n行是士兵的初始位置,
每行2個整數x 和y,-10000<=x,y<=10000。
分析:
對於有序序列a,我們易知s=|a[1]-k|+|a[2]-k|+...+|a[n]-k|,當 k 為序列 a 的中位數時,s 取最小值。
因此對於 y 座標的確定較簡單,找出中位數即可,假設最後所有士兵所處的y座標為p。
即是求|y[1]-p|+|y[2]-p|+...+|y[n]-p|的最小值,則p為y序列的中位數
x 方向要排成 x,x + 1,x + 2....x + n-1,換言之,它們最終的 x 座標一定是相連的(連續的)。
只要找到乙個確定的點就可以確定新的 x 序列了。
假如排好後最左邊的座標為 q,則移動的步數就是|x[0]-q|+|x[1]-(q+1)|+|x[2]-(q+2)|+...+|x[n]-
(q+n)|,就是|x[0]-q|+|x[1]-1-q|+|x[2]-2-q|+..+|x[n]-n-q|,
變形一下|(x[0]-0)-q|+|(x[1]-1)-q|+|(x[2]-2)-q|+..+|(x[n]-n)-q|
我們將(x[i]-i)看成乙個新的數字xi
那麼 q 為新的 x 序列的中位數。對 x[i] 排序,求出 x[i]-i,再排序,求出q
**如下:#include#include#includeusing namespace std;
int a[10005];
struct points[10050];
bool cmpx(point a,point b){
return a.x
士兵站隊問題
問題描述 在乙個劃分成網格的操場上,n個士兵散亂地站在網格點上,網格點由整數座標 x,y 表示。士兵們可以沿網格邊上 下 左 右移動一步,但在同一時刻任一網點上只能有一名士兵。按照軍官的命令,士兵們要整齊地列成乙個水平佇列,即排列成 x,y x 1,y x n,y 如何選擇x和y的值才能使士兵們以最...
士兵站隊問題
題解 首先已知縱向移動可以直接通過求中位數得到 那麼問題就是橫方向移動了 我們假設第一位士兵站的位置是k,因為x從x1開始,那麼我們假設成起始位置為k 1吧 不懂接著看完你就懂了 那麼 第二位士兵的位置是 k 2,接著是k 3,k 4,k n 所以,士兵橫向 即平行於y軸方向 移動的距離為 x1 k...
3625 codevs 士兵站隊問題 中位數的妙用
士兵站隊問題 題目描述 description 在乙個劃分成網格的操場上,n個士兵散亂地站在網格點上。網格點用整數座標 x,y 表示。士兵們可以沿網格邊往上 下 左 右移動一步,但在同一時刻任一網格點上只能有一名士兵。按照軍官的命令,士兵們要整齊地列成乙個水平佇列,即排列成 x,y x 1,y x ...