向右看齊 (排序問題)

2021-08-22 19:35:14 字數 1009 閱讀 5594

輸入資料有多行。第1 行是學生人數n,1≤n≤10000。接下來n 行是同學們的初始位置,每行2個整數x 和y,-10000≤x,y≤10000。

輸出同學們排成一行所需要移動的最少步數。

5

1 22 2

1 33 -2

3 3

8
根據題意,要求所有士兵的最小移動步數,首先要找出他們需站成的水平佇列的第乙個座標(x,y)。求該點的縱座標y很容易,只需將所有士兵的座標按縱座標由小到大排序,他們縱座標的中位數即為所求點的縱座標y。然而要求該點的橫座標x,就需仔細思考,我們可以知道要使所有士兵的移動步數最小,那麼每個士兵都應該移動到離自己最近的佇列位置,但又不能插隊,所以第乙個士兵應該移動進佇列的第乙個位置,第二個士兵應該移動進佇列的第二個位置……設每個士兵的橫座標按由小到大排序後為x0,x1,x2,……所以,我們可以得出所有士兵在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,x2-2,…,xn-1-(n-1)的中位數。由此就可以找出水平佇列的第乙個座標(x,y),然後根據第乙個士兵移動進佇列的第乙個位置,第二個士兵移動進佇列的第二個位置……計算出移動步數即為最小移動步數。

**

#include#includeusing namespace std;

const int maxn=20000+5;

int x[maxn],y[maxn];

int main()

sort(x,x+n);//對x,y排序

sort(y,y+n);

for(int i=0;isort(x,x+n);

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

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

for(int i=0;iprintf("%d\n",ans);

return 0;

}

向右看齊 棧

給出n role presentation style position relative n n條線段,輸出每條線段前面比它高並且離他最近的線段。最簡單的暴力方法,o n2 role presentation style position relative o n 2 o n2 列舉,預期得分50...

P2947 向右看齊

約翰的n 1 n 10 5 頭奶牛站成一排,奶牛i的身高是hi l hi 1,000,000 現在,每只奶牛都在向右看齊 對於奶牛i,如果奶牛j滿足i第 1 行輸入 n,之後每行輸入乙個身高 h i。共 n 行,按順序每行輸出乙隻奶牛的最近仰望物件,如果沒有仰望物件,輸出 0。632 6112330...