PKU 2833-The Average

問題概要

n個の要素の数列がある.大きい順にn1個と小さい順にn2個の要素を無視したときの平均値を求めよ.

解法

優先順序付きキューを用いて無視するものを記憶する.

実装(C++)

#include <iostream>
#include <algorithm>
#include <queue>
#include <functional>
#include <cstdio>
using namespace std;

int readint(){
	int t;
	scanf("%d",&t);
	return t;
}
int data[25];
int main() {
	int n1,n2,n;
	for(;;){
		n1=readint();n2=readint();n=readint();
		if(n1==0)break;
		swap(n1,n2);
		for(int i=0;i<n1+n2;i++){
			data[i]=readint();
		}
		sort(data,data+n1+n2);
		priority_queue<int> low;priority_queue<int,vector<int>,greater<int> > high;
		for(int i=0;i<n1+n2;i++){
			if(i<n1)low.push(data[i]);
			else high.push(data[i]);
		}
		long long ans=0;
		int q;
		for(int i=0;i<n-n1-n2;i++){
			q=readint();
			if(q<low.top()){
				ans+=low.top();low.pop();
				low.push(q);
			}else if(q>high.top()){
				ans+=high.top();high.pop();
				high.push(q);
			}else{
				ans+=q;
			}
		}
		printf("%.6f\n",ans/(double)(n-n1-n2));
	}
	return 0;
}