2019-06-02
題目: 洛谷 p1168 中位數 :
給出乙個長度為nnn的非負整數序列aia_iai,對於所有1≤k≤(n+1)/21 ≤ k ≤ (n + 1) / 21≤k≤(n+1)/2,輸出a1,a3,…,a2k−1a_1, a_3, …, a_a1,a3,…,a2k−1的中位數。即前1,3,5,…1,3,5,…1,3,5,…個數的中位數。
輸入格式:
第111行為乙個正整數nnn,表示了序列長度。
第222行包含nnn個非負整數ai(ai≤109)a_i (a_i ≤ 10^9)ai(ai≤109)。
輸出格式:
共(n+1)/2(n + 1) / 2(n+1)/2行,第iii行為a1,a3,…,a2k−1a_1, a_3, …, a_a1,a3,…,a2k−1的中位數。
輸入樣例#1:
71 3 5 7 9 11 6
輸出樣例#1:
1356
對於20%20\%20%的資料,n≤100n ≤ 100n≤100;
對於40%40\%40%的資料,n≤3000n ≤ 3000n≤3000;
對於100%100\%100%的資料,n≤100000n ≤ 100000n≤100000。
思想:每次輸入保證輸入有序,若為基數,輸出中間值。
方法:使用std::vector$,使用std::upper_bound(std::$.begin(),std::$.end(),value),使用std::$.inster(std::vector::iterator,value)
說明:定義std::vector$
儲存資訊
使用std::upper_bound(std::$.begin(),std::$.end(),value)
找到第乙個嚴格大於value的值所在的迭代器
使用std::$.inster(std::vector::iterator,value)
在迭代器std::vector::iterator
前新增乙個元素值為value
令新新增的數b一定有a<=b
vector下標從0開始,所以奇數的中位數下標一定是[n/2]
ac**:
1//2 #include 3
using
namespace
std;
4 typedef unsigned long
long
ll;5
#define ri register ll67
ll n;
8 vectorq;910
signed main()
1123}24
return0;
25}26//
注意事項:
inster新增元素時,新增在提供迭代器的前方。
upper_bound()嚴格大於,引數左閉右開。
vector下標從0開始。
洛谷 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 ...
洛谷 P1168 中位數
這個題很簡單 但是我要講3種做法 我們維護乙個小根堆乙個大根堆,其中大根堆的堆頂小於小根堆的所有元素,待加入元素大於大根堆堆頂元素就加入小根堆,反之加入大根堆,然後維護兩個堆元素數量,使得兩個堆的元素數量差為1,這樣我們取兩個堆中元素多的那個的堆頂就是答案 初始化的時候先往大根堆裡加入乙個元素,避免...
洛谷 P1168 中位數
給出乙個長度為n的非負整數序列a i 對於所有1 k n 1 2,輸出a 1 a 3 a 2k 1 的中位數。color red 即 color 前1,3,5,個數的中位數。輸入格式 輸入檔案median.in的第1行為乙個正整數n,表示了序列長度。第2行包含n個非負整數a i a i 10 9 輸...