ural 1306. Sequence Median(优先级队列 priority_queue用法)
最近做的ural的題目總是各種錯,看了解題報告都是自己沒學過的玩意,有點受打擊,不過ural的題目質量還是挺好的,多被虐虐有益健康。
這一題要是用數組直接超內存,用優先級隊列做,剛接觸這個,學習一下優先級隊列。
c++stl頭文件聲明<queue>, <queue>包括queue和priority_queue, priority_queue就是優先級隊列。默認使用vector容器實現。優先級隊列容器總是把優先級最高的元素放在隊列最前方來保持隊列的有序性。假如一次push 1,2,3,4,5,6,則優先級隊列中存儲的是6,5,4,3,2,1。
priority_queue支持的操作有:q.empty(), q.size(), q.pop(0), q.top(), q.push(item).
用法參考http://www.cplusplus.com/reference/queue/priority_queue/
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <queue> //for priority_queue 5 using namespace std; 6 int main() 7 { 8 priority_queue<unsigned int> ipq; 9 int n; 10 scanf("%d", &n); 11 unsigned int t; 12 for (int i = 1; i <= n / 2 + 1; ++i) 13 { 14 scanf("%u", &t); 15 ipq.push(t); 16 } 17 int tn = n / 2 + 2; 18 while (tn <= n) 19 { 20 scanf("%u", &t); 21 ipq.push(t); 22 ++tn; 23 ipq.pop(); 24 } 25 if (n & 1) //if n is odd 26 printf("%u.0\n", ipq.top()); 27 else 28 { 29 int t1 = ipq.top(); 30 ipq.pop(); 31 printf("%.1f", (double)(t1 + ipq.top()) / 2); 32 } 33 return 0; 34 }還有兩點需要注意的:1.結果的格式,如果中位數是整數也要輸出.0,保留一位小數。2數據類型,雖然每個數都小于2^31-1,但是可能會出現中間有兩個數都是INT_MAX的情況,例如n=4且四個數都是2^31-1,中間兩個數相加時就會超出INT_MAX輸出-1.
程序的思路就是:先把前n/2+1個元素加入優先級隊列,此時優先級隊列遞減排列,以后每加入一個元素之后刪除對頭最大元素,當所有元素入隊后,由于最大元素不斷被刪除,最后對頭元素就是中位數。(分別處理n為奇數偶數的情況)
轉載于:https://www.cnblogs.com/PegasusWang/archive/2013/03/23/2977597.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的ural 1306. Sequence Median(优先级队列 priority_queue用法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: smart要国产,国产后准备推出史上最大
- 下一篇: 军工无人机龙头股票代码