POJ2833,The Average(優先佇列)

2021-09-24 00:17:11 字數 911 閱讀 9356

突破口:開兩個優先佇列q_ma,q_mi,前者維護前n1個最大的數,後者維護後n2個最小的數。

原本打算用乙個優先佇列儲存資料,但是如果全部都存的話會爆記憶體,而且還可能會超時,然後就想能不能用乙個優先佇列來存n-(n1+n2)個數就好(因為最終有效的資料個數就只有n-(n1+n2)個),這樣就不會爆記憶體而且也省時,然而,發現這樣存的話,當佇列的大小達到n-(n1+n2)時,接下來沒法判斷下乙個元素是否該入列,或者原先裡的元素是否要出列。

於是,突然想到能不能用兩個優先佇列來存n1+n2個元素,乙個存n1個,也就是前n1個最大的,乙個存n2個,也就是後n2個最小的。事實證明是可以的。

開兩個優先佇列q_ma,q_mi,前者從小到大排序,後者從大到小排序,這樣可以確保q_ma的隊首為前n1個最大的當中最小的那個, 而q_mi的隊首為後n2個最小的當中最大的那個,方面後面判斷元素是否應該入列。以q_ma為例,當其大小達到n1時,輸入a,當a>q_ma.top()時,a入列,q_ma.pop()出列。q_mi同理

**如下:

#include#include#includeusing namespace std;

priority_queueqmi;

priority_queue,greater> qma;

int main()

}if(c2else}}

} if(flag) printf("0.000000\n");

else

while(!qma.empty())

printf("%lf\n",sum/(double)(n-n1-n2)); //小心除以0的情況

} }return 0;

}

POJ2833優先佇列

見題號吧 就是說有n個評分,裁判系統需要減去n1個最高分和n2個最低分,然後求出平均分.n1 n2 由於題給的記憶體大小為10000kb,而乙個5,000,000的陣列需要4 5000000 b 20000kb 會超出記憶體限制於是,不能存5000000陣列 我們想到用2個優先佇列模擬n1個最大值,...

2833 奇怪的夢境

2833 奇怪的夢境 時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解 檢視執行結果 題目描述 description aiden陷入了乙個奇怪的夢境 他被困在乙個小房子中,牆上有很多按鈕,還有乙個螢幕,上面顯示了一些資訊。螢幕上說,要將所有按鈕都按下才能出去,而又給出了一些...

poj 2833 堆的應用(去若干最大值最小值)

題意 給定一些正數,去掉給定個數的最大值和給定個數的最小值,輸出其餘數字的平均數。思路 建立乙個大頂堆,乙個小頂堆。大頂堆的大小為去掉的最小值個數,存放當前的若干最小值。遍歷資料的同時維護這兩個堆,最後堆中的資料即為需要去掉的資料。輸入 1 2 5 1 2 3 4 5 4 2 10 2121187 ...