日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

ural 1306. Sequence Median(优先级队列 priority_queue用法)

發布時間:2024/10/12 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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用法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。