poj 1723 求中位數(讓士兵站成一排)

2021-06-28 12:38:45 字數 590 閱讀 2227

題意:有n個士兵,每個士兵站的位置用乙個座標(x,y)表示,現在要將n個士兵站在同乙個水平線,即所有士兵的y座標相同並且x座標相鄰,每個士兵每次可以向相鄰位置移動一步。求最少的移動步數。

思路:先把他們按照橫座標相鄰排好。我們先把橫座標排序,並假設起點是a,那麼我們就是要求i=0~n-1,abs(a+i - x[i])的加和。即i=0~n-1,abs(a-(x[i] - i))的加和。我們構建乙個新數列zi = xi - i,當a 等於z的中位數時原式的值最小。隨後再將他們移動到同一橫排,這橫排應該是他們縱座標的中位數,才能使得此過程總步數最少。

綜上我們可以得到乙個普遍結論,就是對於乙個數列xi(i=1~n),取乙個數a使得i=1~n時abs(xi-a)的加和最小,那麼a應該是數列xi的中位數。(

#include #include #define n 10005

int s[n],t[n],n,a[n];

int cmp(const void *a,const void *b)

int main(){

while (scanf("%d",&n)!=eof) {

int i,f1,f2,res=0;

for(i = 0;i

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

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

中位數 士兵站隊 nkoj 3551

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

poj 1723Soldiers 帶全中位數

include includeusing namespace std int n,x 10000 y 10000 rx,ry,t,sum int main sort y,y n ry y n 2 sort x,x n for int i 0 i題意 給定n個點,將它們移到同一行,使得移動的總次數最小...