給定 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,這樣我們取兩個堆中元素多的那個的堆頂就是答案 初始化的時候先往大根堆裡加入乙個元素,避免...