题目地址:
http://poj.org/problem?id=2833
题目大意:
给出n个数字,去除其中n1个最大值和n2个最小值,求出剩余的平均值是多少。题目给的数据非常的多,无法全部存下。
解题思路:
找两个优先队列,也就是堆来维护n1个最大值和n2个最小值,最大值的队列为big,最小值为small,如果big.size()>n1的话,就去除掉其中最小的元素,可能有人就问了,这去除掉最小的太麻烦了,所以这里用到了一个技巧,存的时候存的是负值,这样pop的时候就是最小值了,small同理。
AC代码:
#include <iostream>
#include <queue>
using namespace std;
typedef long long ll;
int main()
{
ll n1, n2, n;
while (scanf("%lld %lld %lld", &n1, &n2, &n), (n1 + n2 + n))
{
priority_queue<ll>big, small;
ll num = 0, sum = 0;
for (int i=0; i<n; i++)
{
scanf("%d", &num);
sum+=num;
big.push(-num);
small.push(num);
if (big.size() > n1)
{
big.pop();
}
if (small.size() > n2)
{
small.pop();
}
}
for (int i=0; i<n1; i++)
{
sum+=big.top();
big.pop();
}
for (int i=0; i<n2; i++)
{
sum-=small.top();
small.pop();
}
printf("%0.6lf\n", sum*1.0/(n-(n1+n2)));
}
return 0;
}