您的位置:首页 > 其它

POJ 2833 解题报告

2015-10-24 04:31 323 查看
这道题挺简单的。维护一个最小堆,一个最大堆(因为堆的大小在10以内,我猜数组也可以?)就可以了。

thestoryofsnow2833Accepted204K3391MSC++1099B
/*
ID: thestor1
LANG: C++
TASK: poj2833
*/
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <limits>
#include <string>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <queue>          // std::priority_queue
#include <stack>
#include <algorithm>
#include <cassert>

using namespace std;

int main()
{
int n1, n2, n;
priority_queue<int, std::vector<int>, std::greater<int> > greatest;
priority_queue<int> least;
double sum;
int num, gsum, lsum;
while (scanf("%d%d%d", &n1, &n2, &n) > 0 && n)
{
sum = 0;
for (int i = 0; i < n; ++i)
{
scanf("%d", &num);
sum += num;
if (greatest.size() < n1)
{
greatest.push(num);
}
else if (num < greatest.top())

if (greatest.size() > n1)
{
greatest.pop();
}
least.push(num);
if (least.size() > n2)
{
least.pop();
}
}

n -= greatest.size() + least.size();

gsum = 0;
while (!greatest.empty())
{
gsum += greatest.top();
greatest.pop();
}

lsum = 0;
while (!least.empty())
{
lsum += least.top();
least.pop();
}

printf("%.6lf\n", (sum - gsum - lsum) / n);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: