HPU 1470 中位數 分治

2021-08-14 06:16:39 字數 1685 閱讀 5573

時間限制: 1 sec 記憶體限制: 128 mb

題目描述

ocean有兩個公升序序列a和b,現在他將a和b合併後得到新序列c,他想知道序列c的中位數。

輸入 第一行輸入乙個整數t,代表有t組資料。每組資料第一行輸入乙個整數n,代表a、b序列元素個數。接下來一行依次輸入n個整數,代表序列a的元素。接下來一行依次輸入n個整數,代表序列b的元素。

注:1<=t<=5000,1<=n<=5000,1<=序列元素<=1e9,由於輸入輸出資料過多,請對輸入輸出進行特殊處理。

輸出 對每組測試資料,輸出乙個結果代表新序列的中位數。

樣例輸入

3 2

1 2

3 4

3 1 2 3

4 5 6

5 1 2 3 4 5

2 4 6 7 8

樣例輸出

2 3

4 **

czy

分析:本題難點在於奇偶性判斷,wa了好多次····

其實c++有個函式專門find第k大的數(stl中的nth_element()方法的使用 通過呼叫nth_element(start, start+n, end) 方法可以使第n大元素處於第n位置(從0開始,其位置是下標為 n的元素),並且比這個元素小的元素都排在這個元素之前,比這個元素大的元素都排在這個元素之後,但不能保證他們是有序的)本題會超時,連o(n)的輸入都要優化····

正解是二分,因為兩個序列是有序的,利用分治的思想。在二分下,兩個序列的下標滿足:id

1+id

2=2∗

n+1. 所以一般情況下二分的時候會直接向下取整,導致你**出來的序列id

1+id

2≠2∗

n+1. 其實二分時你的兩個序列所面臨的情況一致的,也就是向下取整的情況是同時出現的,而此時其中乙個序列會通過改變r向下取整,那麼另乙個序列就需要通過l++來維護id

1+id

2=2∗

n+1.

*有時候判斷不好l和r如何取值的時候,可以手動模擬特殊情況,或者n比較小的時候,結果慢慢就出來了;

#include 

#include

using namespace std;

inline void scan(int &num)

else num=in-'0';

while(in=getchar(),in>='0'&&in

<='9')

if(isn) num=-num;

}int a[5010], b[5010];

int main()

for(int i = 1; i <= n; i++)

bool flag = false;

int l1 = 1, r1 = n, mid1;

int l2 = n + 1, r2 = n + n, mid2;

int tt = 20;

while(tt--)

else

}else

if(a[mid1] < a[mid2])

else

}if(a[mid1] == a[mid2])

}if(!flag) printf("%d\n", min(a[l1], a[l2]));

}return

0;}

一維點距的中位數 (分治)

這道題其實挺水的,主要是考當我們看到題目要求所有距離的中位數時,我們能否想到答案的單調性進而想到二分答案。像我這種蒟蒻就想不到 首先中位數,它是很特殊的乙個數,我們發現如果直接求它複雜度很高有 o n 2 但是如果我們是判斷乙個數是不是中位數就不一樣了 只要我們排個序,就可以用貪心 o n 的求出是...

題目1157 中位數

題目描述 中位數定義 一組資料按從小到大的順序依次排列,處在中間位置的乙個數 或最中間兩個資料的平均數 給出一組無序整數,求出中位數,如果求最中間兩個數的平均數,向下取整即可 不需要使用浮點數 輸入 該程式包含多組測試資料,每一組測試資料的第一行為n,代表該組測試資料報含的資料個數,1 n 1000...

python中獲取中位數

普通方法 對列表進行排序,然後根據長度為奇數或者偶數的不同情況計算中位數 def huahua x length len x print length x.sort print x if length 2 1 z length 2 y x z else y x length 2 x length 2...