Statistical problem (statistic)

Description


Betty is working on a large-scale data statistics problem. She has obtained (n) positive integers (a_i). Now she wants to select (n_1) and (n_2) numbers, so that the average of (n_1) numbers minus the average of (n_2) numbers maximum. Programming helped her complete this problem.

Format


Input

The first row is positive integers (n), (n_1), and (n_2) ((n≤3 imes 10^6), (n_1), (n_2≤20), (n_1+n_2≤n)); the second row is (n) positive integers (a_i) ((≤10^9)) separated by spaces.

Output

Only one real number represents the result, and 3 decimal places are reserved.

Sample


Input

2 1 1
1 5

Output

4.000

Hint


(30\%) data, guarantee (n≤10^4);
(60\%) data, guarantee (n≤10^6);
(100\%) data, guarantee (n≤3 imes 10^6).

Sample Code


#include <cstdio>
#include <algorithm>
#include <functional>
#include <queue>
//#include <vector>
using namespace std;
const int N=3000005;////
void in(int &x){
	char c=getchar();
	while (c<'0' || c>'9') c=getchar();
	for (x=0; c>='0' && c<='9'; c=getchar())
		x=x*10+c-'0';
}
int a[N];
int main(){
    freopen("statistic.in", "r", stdin);
    freopen("statistic.out", "w", stdout);
    int n, n1, n2;
    scanf("%d %d %d", &n, &n1, &n2);
    
    //方法1:直接调用sort,时间较慢 
    /*for (int i=0; i<n; i++)
    	in(a[i]);
    sort(a, a+n);    
    double s1=0.0, s2=0.0;
    for (int i=0; i<n2; i++)
    	s2+=a[i];
    for (int i=n-n1; i<n; i++)
    	s1+=a[i];
	printf("%.3f
", s1/n1-s2/n2);*/ 
    
	//方法2:使用nth_element
    /*double s1=0.0, s2=0.0;
	for (int i=0; i<n; i++)
		in(a[i]);
	nth_element(a, a+n1, a+n, greater<int>());
	for (int i=0; i<n1; i++)
		s1+=a[i];
	nth_element(a, a+n2, a+n);
    for (int i=0; i<n2; i++)
    	s2+=a[i];
	printf("%.3f
", s1/n1-s2/n2);
	*/
	
    //方法3:调用partial_sort    
    /*for (int i=0; i<n; i++)
		in(a[i]); 
	double s1=0, s2=0;
	partial_sort(a, a+n2, a+n);
	for (int i=0; i<n2; i++)
		s2+=a[i];
	partial_sort(a, a+n1, a+n, greater<int>()); //greater函数需头文件<functional> 
	for (int i=0; i<n1; i++)
		s1+=a[i];
	printf("%.3f
", s1/n1-s2/n2); */
	
	
	/*//方法4:冒泡 
    int x, mx[21], mn[21];
    for (int i=0; i<=n1; i++) 
        mx[i]=-1;
    for (int i=0; i<=n2; i++) 
        mn[i]=1<<30;
    for (int i=0; i<n; i++){        
		in(x);//scanf("%d", &x);
        for (int j=n1-1; j>=0; j--)
            if (x>mx[j]) {
                mx[j+1]=mx[j]; mx[j]=x;
            }
            else break;
        for (int j=n2-1; j>=0; j--)
            if (x<mn[j]) {
                mn[j+1]=mn[j]; mn[j]=x;
            }
            else break;
    } 
    double s1=0.0, s2=0.0;
    for (int i=0; i<n1; i++) 
        s1+=mx[i];
    for (int i=0; i<n2; i++) 
        s2+=mn[i];
    printf("%.3f
", s1/n1-s2/n2); */

	
	//方法5:优先队列 
    int x;
	priority_queue <int, vector<int>, greater<int> > ux;
	priority_queue <int> vx;
    for (int i=0; i<n1; i++)
    	ux.push(-1);
    for (int i=0; i<n2; i++) 
        vx.push(1<<30);
    for (int i=0; i<n; i++){        
		in(x);
		ux.push(x); ux.pop();
		vx.push(x); vx.pop();
    } 
    double s1=0.0, s2=0.0;
    for (int i=0; i<n1; i++) {
        s1+=ux.top(); ux.pop();
	} 
	for (int i=0; i<n2; i++) {
        s2+=vx.top(); vx.pop();
	} 
    printf("%.3f
", s1/n1-s2/n2); /**/

    return 0;
}
原文地址:https://www.cnblogs.com/jiupinzhimaguan/p/13806430.html