中位數 排序

2021-10-12 06:57:57 字數 1322 閱讀 6493

題目描述

在乙個劃分成網格的操場上,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。

輸出第1 行中的數是士兵排成一行需要的最少移動步數。

樣例輸入51

2221

33-2

33

樣例輸出

8

*要求排列成有序的一橫排(預設為遞增序列),

*可分步進行,根據複雜程度分為x和y兩步,且先移動y座標。

*先將每個point移至一水平線(存在2個或以上的點重合在一起的情況)。

*要求總的移動步數最少,則x軸和y軸的移動步數均為最少。

*故找出所有點y座標的中位數,假設為y_middle,

*則y=y_middle直線表示排序後的水平直線。

*x軸時,先進行一次排序後,

*假設水平線上的n個點儲存在陣列a[n]中,

*則第乙個點a[0]最終排序後的位置是addr,

*a[1]的最終位置是(addr+1),

*a[2]的最終位置是(addr+2)……a[n]->(addr+n)。

*分析則有:addr = a[0]-0 = a[1]-1 = a[2]-2 = … = a[i]-i = … = a[n]-n。

*故可將(a[i]-i)視為乙個新的point,並將n各新的point移動到同乙個位置addr。

*可以看出,將x軸的問題轉化為了和y軸相同的問題。最後得出最少步數。

*

#include

#include

using

namespace std;

intmain()

sort

(x,x+m)

;sort

(y,y+m)

;for

(int i=

0;i)sort

(x,x+m)

;int res=

0,xmid,ymid;

if(m%2==

0)else

for(

int i=

0;i) cout << res << endl;

}

中位數的中位數

參照王曉東的演算法設計 中位數的中位數,即將一串數分成n段,求其排好序了的中間那個數,再把這些所有中位數再求一次中位數。for int i 0 i r p 4 5 i 找中位數的中位數,r p 4即上面所說的n 5 int x lineselect a,p,p r p 4 5,r p 4 10 線性...

BFPRT(中位數的中位數)演算法

又稱為 中位數的中位數演算法 該演算法由 blum floyd pratt rivest tarjan 在1973年提出,最壞時間複雜度為o n 最差的空間複雜度為o logn 演算法步驟 1 將 n 個元素劃分為 n 5 個組,每組 5 個元素,若有剩餘,捨去 2 使用排序方法找到 n 5 個組中...

hive 中位數 Hive的中位數

關於求解中位數,我們知道在python中直接有中位數處理函式 mean 比如在python中求解乙個中位數,很簡單。python計算中位數 import numpy as np nums 1.1,2.2,3.3,4.4,5.5,6.6 均值np.mean nums 中位數 np.median num...