POJ 3579 Median 尺取 二分

2021-09-11 05:38:22 字數 1139 閱讀 3569

給n數字, x1, x2, … , xn,我們計算每對數字之間的差值:∣xi - xj∣ (1 ≤ i < j ≤n). 我們能得到 c(n,2) 個差值,現在我們想得到這些差值之間的中位數。如果一共有m個差值且m是偶數,那麼我們規定中位數是第(m/2)小的差值。

input輸入包含多測

每個測試點中,第一行有乙個nthen n 表示數字的數量。

接下來一行由n個數字:x1, x2, … , xn

( xi ≤ 1,000,000,000 3 ≤ n ≤ 1,00,000 )output對於每個樣例,輸出中位數即可。

sample input4

1 3 2 4

31 10 2

sample output1

8理解:這道題首先我們可以想到的方法就是暴力列舉 但是毫無疑問 n方的複雜度一定會超時 所以我們用二分+尺取把複雜度降到nlogn

實現方法:

首先我們可以去二分搜尋所有的差值可能性 也就是(1e9-0)種可能性 數字雖然打 但使用二分後其實並不慢 然後我們用每次搜尋到的差值在原陣列中去尋找比這個中位數小的所有數 在這裡我們可以使用尺取 把本來需要n方的複雜度降到n 然後記錄下這個數的總和 與我們中位數的總數除以二走比較 如果搜尋到總數的小於二分中搜尋到的那個數 我們就把mid變成start 反之則把mid變成end 直到搜素到乙個中位數 比這個數小的綜合恰好等於c(n,2)

ac**:

#include

#include

#include

using namespace std;

int a[

100010];

int n;

long

long flag;

intjudge

(int median)

if(sum>=flag)

return1;

return0;

}int

search()

//二分列舉

return end;

}int

main()

return0;

}

這道題在我看來很不好做了 剛開始w了三次 難點一是在於想到如何用尺取+二分 二是在於對於二分的不熟練 還是要對二分的幾種邊界條件多加注意

二分查詢 POJ3579 Median

給定乙個長度為n的正整數序列a,現有a中的所有元素任意兩兩做差,形成乙個長度為cn2 c n 2 cn2 的序列b,求出b的中位數。其中,1 n 1e5,0直接求出這些差值 排列 選中位數,顯然會超時,其時間複雜度為o n 2 log n 2 其中求值為o n 2 排列為o m log m 二分查詢...

POJ 3579 Median 二分 思維

給你一些數,然後求這些數相互之間差的絕對值,然後絕對值排序,找到中間那個數。我反正一直開始是沒有想到這個題竟然可以用二分來做。二分列舉答案,假設列舉值為mid,然後就是在排好序的序列中對每乙個num i 找到在i之後,有多少個大於num i mid的數的個數 數列裡的值比num i mid大,說明該...

Poj3579Median二分查詢第K大

題目鏈結 題目 給定一組數x ix i xi 我們可以得到c n 2 c n,2 c n,2 個差值 xi xj i x i x j i j xi x j i,問求這些差值組成的數列中第k kk個 k c n,2 2 k c n,2 2 k c n 2 2 是多少。思路比較常見的二分題目。首先對輸入...