最近做的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 odd26 printf("%u.0\n", ipq.top());27 else28 {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為奇數偶數的情況)