zoukankan      html  css  js  c++  java
  • [swustoj 1094] 中位数

    中位数(1094)

    问题描述

    中位数(又称中值,英语:Median),统计学中的专有名词,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,则中位数不唯一,通常取最中间的两个数值的平均数作为中位数。

    输入

    多组输入

    第一行:一个正整数N (0<N<1000000) 第二行:N个正整数。(0=<A[i]<2^30)

    输出

    每组数据先输出”Case X:”,X表示测试数据的编号,从1开始。

    第二行输出N个数,第i个数对应数组前i个值的中位数。(精确到小数点后一位)

    样例输入

    5
    1 2 3 4 5
    6
    2 5 4 8 7 4

    样例输出

    Case 1:
    1.0 1.5 2.0 2.5 3.0
    Case 2:
    2.0 3.5 4.0 4.5 5.0 4.5

    方法1:简单线段树

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    #define N 1000010
    
    int n;
    int a[N];
    int b[N];
    int c[N];
    int cnt[N<<2];
    
    void pushup(int rt)
    {
        cnt[rt]=cnt[rt<<1]+cnt[rt<<1|1];
    }
    void build(int n)
    {
        memset(cnt,0,sizeof(cnt));
    }
    void update(int l,int r,int rt,int pos)
    {
        if(l==r)
        {
            cnt[rt]++;
            return;
        }
        int m=(l+r)>>1;
        if(pos<=m) update(l,m,rt<<1,pos);
        else update(m+1,r,rt<<1|1,pos);
        pushup(rt);
    }
    int query(int l,int r,int rt,int c)
    {
        if(l==r) return l;
        int m=(l+r)>>1;
        if(c<=cnt[rt<<1]) query(l,m,rt<<1,c);
        else return query(m+1,r,rt<<1|1,c-cnt[rt<<1]);
    }
    int main()
    {
        int iCase=1;
        while(scanf("%d",&n)!=EOF)
        {
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&a[i]);
                b[i]=a[i];
            }
            sort(b+1,b+n+1);
            for(int i=1;i<=n;i++)
            {
                int t=a[i];
                a[i]=lower_bound(b+1,b+n+1,a[i])-b;
                c[a[i]]=t;
            }
            build(n);
            printf("Case %d:
    ",iCase++);
            for(int i=1;i<=n;i++)
            {
                if(i-1) printf(" ");
                update(1,n,1,a[i]);
                if(i&1) printf("%.1f",double(c[query(1,n,1,i/2+1)]));
                else printf("%.1f",(c[query(1,n,1,i/2)]+c[query(1,n,1,i/2+1)])/2.0);
            }
            printf("
    ");
        }
        return 0;
    }

    方法2:使用两个优先队列,前者存前一半的数,后者存后一半的数即可

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<functional>
    #include<algorithm>
    using namespace std;
    #define N 1000010
    
    int n;
    int num;
    float ans[N];
    
    priority_queue<int,vector<int>,less<int> > q1;      //存放前(n+1)/2位数字,大数为优先级最大
    priority_queue<int,vector<int>,greater<int> > q2;   //存放前(n-1)/2位数字,小数为优先级最大
    
    int main()
    {
        int iCase=1;
        while(scanf("%d",&n)!=EOF)
        {
            while(!q1.empty())q1.pop();
            while(!q2.empty())q2.pop();
    
            for(int i=1;i<=n;++i)
            {
                scanf("%d",&num);
                if(i==1) q1.push(num);
                else
                {
                    if(num<=q1.top()) q1.push(num);
                    else q2.push(num);
                }
                if(q1.size()>q2.size()+1)
                {
                    q2.push(q1.top());
                    q1.pop();
                }
                if(q1.size()<q2.size())
                {
                    q1.push(q2.top());
                    q2.pop();
                }
                if(i&1) ans[i]=q1.top();
                else ans[i]=(q1.top()+q2.top())/2.0;
            }
    
            printf("Case %d:
    ",iCase++);
            for(int i=1;i<=n;++i)
            {
                if(i!=1) printf(" ");
                printf("%.1f",ans[i]);
            }
            printf("
    ");
        }
        return 0;
    }
    趁着还有梦想、将AC进行到底~~~by 452181625
  • 相关阅读:
    [转]zxing二维码的生成和解码 j2se
    [转]Android的网络与通信
    (转)Firefox:浏览器内置数据库之路
    dom Framework oop模块
    我的框架 别名机制
    获取屏幕的PDI值
    mass Framework lang模块
    王云飞 《绿色生活》(附译文)
    dom Framework query模块
    dom Framework核心模块发布!(更新)
  • 原文地址:https://www.cnblogs.com/hate13/p/4486373.html
Copyright © 2011-2022 走看看