….見題號吧
就是說有n個評分,裁判系統需要減去n1個最高分和n2個最低分,然後求出平均分.
n1+n2
由於題給的記憶體大小為10000kb,而乙個5,000,000的陣列需要4*5000000* b = 20000kb
會超出記憶體限制於是,不能存5000000陣列
我們想到用2個優先佇列模擬n1個最大值,和n2個最小值
最後用所有得分的總和減去n1個最大值和n2個最小值.再除以個數.就是平均值.
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
priority_queuevector
,less > small; ///最大堆 -> 彈出最大值,保留最小n2個
priority_queuevector
,greater > big; ///最小堆 -> 彈出最小值,保留最大n1個
int main()
ll temp = 0;
while(!small.empty()) temp += small.top(),small.pop();
while(!big.empty()) temp += big.top(),big.pop();
printf("%.6f\n",1.0*(ans-temp)/(n-n1-n2));
}return
0;}
POJ2833,The Average(優先佇列)
突破口 開兩個優先佇列q ma,q mi,前者維護前n1個最大的數,後者維護後n2個最小的數。原本打算用乙個優先佇列儲存資料,但是如果全部都存的話會爆記憶體,而且還可能會超時,然後就想能不能用乙個優先佇列來存n n1 n2 個數就好 因為最終有效的資料個數就只有n n1 n2 個 這樣就不會爆記憶體...
poj 2833 堆的應用(去若干最大值最小值)
題意 給定一些正數,去掉給定個數的最大值和給定個數的最小值,輸出其餘數字的平均數。思路 建立乙個大頂堆,乙個小頂堆。大頂堆的大小為去掉的最小值個數,存放當前的若干最小值。遍歷資料的同時維護這兩個堆,最後堆中的資料即為需要去掉的資料。輸入 1 2 5 1 2 3 4 5 4 2 10 2121187 ...
poj 2970 優先佇列
先按di排序,從小到大 然後依次完成合同,若發現第i個合同無法在截止日期前完成,便從之前已經完成的任務中選乙個aj最大的合同,付錢來使得這個合同盡快完成。include include include include include using namespace std struct node i...