問題描述:給你n個士兵在棋盤裡的座標,要你將他們排成連續的一行(即與x軸平行),問你最少要將這些士兵移動多少步。
題解:對於y軸方向上的處理,顯然是排序後找中位數。而x軸方向的因為要相鄰,所以有點麻煩。考慮已排好序的x座標,最終狀態下他們的相對位置已經固定。
設最終狀態下的第乙個座標為 x+1
則第乙個點的最終座標為x+1 從x[1]---->x+1
第二個點的最終座標為x+1 從x[2]---->x+2
第三個點為最終座標為x+2 從x[3]---->x+3
第四個點為最終座標為x+3 從x[4]---->x+4
第五個點為最終座標為x+4 從x[5]---->x+5
…x[1] - 1---->x
x[2] - 2---->x
x[3] - 3---->x
x[4] - 4---->x
x[5] - 5---->x
問題轉化為找到乙個x 使得 移動最小 和y 軸的處理方式一樣了。
#include
using namespace std;
const
int maxn=
100000
;int x[maxn]
,y[maxn]
,n;int
main()
cout<}
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個點,將它們移到同一行,使得移動的總次數最小...
poj 1723 SOLDIERS 帶權中位數
帶權中位數型別的題目 可以先考慮降維,最後集合的y座標,明顯是y座標的中位數的位置,容易求出y方向的貢獻res y。比較麻煩的是在x座標上最後是要列成一排,而不是單獨的乙個點,我們可以假設最後集合的最左邊的點是x,採用貪心的策略列出公式 res x sum abs xi x i i belongs ...
分治演算法 士兵排隊(poj1723)
問題描述 在乙個劃分成網格的操場上,n個士兵散亂地站在網格點上。網格點由整數最表 x,y 表示。士兵可以沿著網格邊上 下 左 右移動一步,但在同一時刻乙個網格上只能有一名士兵。按照軍官的命令,士兵們要整齊地列成乙個水平佇列,即排列成 x,y x 1,y x n 1,y 如何選擇x,y的值,才能使士兵...