The Average
Time Limit: 6000MS | Memory Limit: 10000K | |
Total Submissions: 9028 | Accepted: 2825 | |
Case Time Limit: 4000MS |
http://poj.org/problem?id=2833
把n个裁判们的成绩去掉n1个最大的,n2个最小的再统计平均成绩。
方法是维护两个大小分别为n1和n2的两个优先队列。
注意要用 long long
详见代码
#include <cstdio>
#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <queue>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
int n1,n2,n;
int main()
{
//freopen("input.txt","r",stdin);
while(cin>>n1>>n2>>n,n)
{
priority_queue<int,vector<int>,greater<int> > q1; //最小的数会出现在树顶
priority_queue<int,vector<int>,less<int> >q2; //最大的数会出现在树顶
ll sum=0;
int v;
ll small =0,big=0; //big储存数列q1的和 small存q2
for(int i=0;i<n;i++)
{
scanf("%d",&v);
sum+=v;
if(i<n1) //小于n1时全放进队列中
q1.push(v),
big+=v;
else //大于n1时 如果比队列中最小的大,就替换最小的
if(v>q1.top())
big-=q1.top(),
q1.pop(),
q1.push(v),
big+=v;
if(i<n2)
q2.push(v),
small+=v;
else
if(v<q2.top())
small-=q2.top(),
q2.pop(),
q2.push(v),
small+=v;
}
double ave;
ave=sum-big-small;
ave/=n-n1-n2;
printf("%f\n",ave );
}
return 0;
}