洛谷T7153 (考試) 中位數

2022-03-20 09:30:38 字數 1222 閱讀 3535

給定 n 個數 a1, a2, ..., an,求這 n 個數兩兩的差值(共 n(n−1)

2 個)的中位數。

第一行乙個正整數 n,表示數的個數。

接下來一行 n 個正整數,分別為 a1, a2, ..., an。

一行乙個數表示差值的中位數。

輸入樣例#1:

34 2 6

輸出樣例#1:這裡貌似沒有資料範圍。。。。

好吧我補一下。。

30%資料保證o(n^2)能出解

100%資料n<=2000000,且結果是整數

首先,我們來看看30大暴力

依次求出所有的差(o(n^2))

排序,求解

但是,正解是啥?

先提前劇透一下:二分

我們每次二分出乙個值(中位數)

然後判斷是否可行

如何判斷?首先對所有數進行一次排序

接著,從當前數開始

計算一下加上中位數後比它小的數的個數

最後,統計一下加了幾個數

如果 大於/小於 了數字差的數量的一半 就想 小/大 的地方繼續二分

這樣求完。。。發現,,還是有點問題。。

的確,中位數要麼是乙個數列中的值,

要麼是兩個數的平均值

所以,要求出兩個中位數並且計算它們的平均值即可。

#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define max 2000100

ll n;

ll a[max];

ll tot;

ll ans;

inline int read()

while(ch>='0'&&ch<='9')

return x*t;

}int main()

if(tt*2>tot)l=mid+1;

else r=mid;

}ans=r;

l=0;r=a[n]-a[1];

while(l>1;

ll tt=0,pp=1;

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

if(tt*2>=tot)l=mid+1;

else r=mid;

}cout<<((ans+r)>>1)

}

洛谷 P1168 中位數

題目描述 給出乙個長度為n的非負整數序列a i 對於所有1 k n 1 2,輸出a 1 a 2 a 2k 1 的中位數。color red 即 color 前1,3,5,個數的中位數。輸入輸出格式 輸入格式 輸入檔案median.in的第1行為乙個正整數n,表示了序列長度。第2行包含n個非負整數a ...

洛谷 P1627 中位數

原題 考場想到了正解,但是依舊選擇了暴力,這究竟是天意,還是人覺啊!為了表示內心的惋惜與痛卻,還寫什麼解題思路啊!找到指定數的位置,算一遍字首和 如果a i include include include include include include include include include...

洛谷 P1168 中位數

這個題很簡單 但是我要講3種做法 我們維護乙個小根堆乙個大根堆,其中大根堆的堆頂小於小根堆的所有元素,待加入元素大於大根堆堆頂元素就加入小根堆,反之加入大根堆,然後維護兩個堆元素數量,使得兩個堆的元素數量差為1,這樣我們取兩個堆中元素多的那個的堆頂就是答案 初始化的時候先往大根堆裡加入乙個元素,避免...