時間限制: 1 sec 記憶體限制: 128 mb分析:本題難點在於奇偶性判斷,wa了好多次····題目描述
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
其實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...