• 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;
    }
    
  • 相关阅读:
    团队项目-第一阶段冲刺2
    团队项目-第一阶段冲刺1
    第九周总结
    梦断代码阅读笔记02
    第八周总结
    团队会议个人领取任务
    梦断代码阅读笔记01
    Spring Boot 揭秘与实战(二) 数据缓存篇
    Spring Boot 揭秘与实战(二) 数据缓存篇
    Spring Boot 揭秘与实战(二) 数据缓存篇
  • 原文地址:https://www.cnblogs.com/jiupinzhimaguan/p/13806430.html
Copyright © 2020-2023  润新知