题目链接
题解
题意:
- 给n个分数,去掉n1个最大的和n2个最小的,计算剩下的平均分,精确到小数点后6位。
思路:
- 用两个优先队列,一个较大数先出队,另一个较小数先出队。具体操作如代码注释所示。(这种方法耗时较长,但是很简单)
Code
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include <queue>
#define ll long long
using namespace std;
double ans, tmp;
priority_queue<double,vector<double>,greater<double>> q1; //较大数先出队
priority_queue<double> q2;//较小数先出队
int main()
{
int n1, n2, n, x, i, j;
while(cin>>n1>>n2>>n)
{
if(n1 == 0 && n2 == 0 && n == 0)
break;
ans = 0;
for(i = 1; i <= n; i++)
{
scanf("%d", &x);
tmp = (double)x / (double)(n-n1-n2); //计算每个分数平均后的分值
ans += tmp;//先全部加起来
q1.push(tmp);
q2.push(tmp);
if(q1.size()>n1) q1.pop();//当数量达到时,出对目前较大/小的数
if(q2.size()>n2) q2.pop();//这样,读入所有数据后,队列中剩下的就是要去掉的数据
}
while(!q1.empty())
{
ans -= q1.top();
q1.pop();
}
while(!q2.empty())
{
ans -=q2.top();
q2.pop();
}
printf("%.6lf\n",ans);
}
}