zoukankan      html  css  js  c++  java
  • 51nod1785数据流中的算法

    51nod近日上线了用户满意度检测工具,使用高级人工智能算法,通过用户访问时间、鼠标轨迹等特征计算用户对于网站的满意程度。
     
    现有的统计工具只能统计某一个窗口中,用户的满意程度的均值。夹克老爷想让你为统计工具添加一个新feature,即在统计均值的同时,计算窗口中满意程度的标准差和中位数。
    Input
    第一行是整数n与k,代表有n次操作,时间窗口大小为k。 
    (1 <= n <= 10^6, 1 <= k <= 100)
    
    接下来的n行,每行代表一次操作。操作有“用户访问”、“查询均值”、“查询方差”、“查询中位数”四种。每行的第一个数代表操作类型。
    
    操作数1:用户访问
    输入格式:<1, v>
    用户的满意度v为闭区间[0, 100]中的任意整数。用户每访问一次,数据更新,移动统计窗口。
    
    操作数2:查询均值
    输入格式:<2>
    统计窗口内的用户满意度的均值。
    
    操作数3:查询方差
    输入格式:<3>
    统计窗口内用户满意度的方差
    
    操作数4:查询中位数
    输入格式:<4>
    统计窗口内用户满意度的中位数
    
    p.s. 在有查询请求时,窗口保证不为空
    p.s.s. 有查询请求时,窗口可能不满
    Output
    对于“查询均值”、“查询方差”、“查询中位数”操作的结果,输出保留两位小数。
    Input示例
    12 3
    1 1
    1 2
    1 3
    2
    3
    4
    1 4
    1 5
    1 6
    2
    3
    4
    Output示例
    2.00
    0.67
    2.00
    5.00
    0.67
    5.00

    这道题平均数要保留整数,不要保留小数,题目中居然木有说..

     其余的就乱搞吧,方差就展开用和维护,中位数就暴力吧

    #include<stdio.h> 
    #include<algorithm>
    #include<queue>
    using namespace std;
    queue<int> que;
    int Map[105];
    int main()
    {
        //freopen("in.txt","r",stdin);
        //freopen("out.txt","w",stdout);
        int n,k;
        long long sumx=0,sumsqrx=0;
        scanf("%d %d",&n,&k);
        while(n--)
        {
            int Mode;
            scanf("%d",&Mode);
            if(Mode==1)
            {
                if(que.size()>=k)
                {
                    int p=que.front();
                    que.pop();
                    sumx-=p;
                    sumsqrx-=p*p;
                    Map[p]--;
                }
                int key;
                scanf("%d",&key);
                Map[key]++;
                que.push(key);
                sumx+=key;
                sumsqrx+=key*key; 
            }else
            if(Mode==2)
            {
                printf("%.2f
    ",double(sumx/que.size()));    
            }else
            if(Mode==3)
            {
                double x=1.0*sumx/que.size();
                double res=x*que.size()*x+sumsqrx-2*x*sumx;
                printf("%.2f
    ",res*1.0/que.size());    
            }else
            { 
                if(que.size()%2==1)
                {
                    int sum=0;
                    int i;
                    int num=que.size()/2+1; 
                    for(i=0;i<=100&&sum<num;++i)
                    {
                        sum+=Map[i];
                    }
                    printf("%.2f
    ",double(i-1));    
                }else
                {
                    int sum=0;
                    int num=que.size()/2+1;
                    int tot=num; 
                    int last=0;
                    int i;
                    for(i=0;i<=100&&sum<num;++i)
                    {
                        sum+=Map[i];
                        if(sum<num) tot-=Map[i];
                        if(sum<num&&Map[i]) last=i;
                    }
                    i--;
                    if(tot>=2) printf("%.2f
    ",double(i));else printf("%.2f
    ",(last+i)/2.0);    
                }    
            }    
        }
    }
     

    PS:stdio.h真的快

  • 相关阅读:
    win7 下加载MSCOMCTL.OCX
    getGLES1ExtensionString: Could not find GLES 1.x config!
    IUnknown(TVarData(Params[0]).VPointer) as Range
    win8 VB6打开提示MSCOMCTL.ocx未注册
    服务端接口处理流任务要如何返回?
    flink之kafka生产和消费实战-将生产数据存放到mongodb中
    初识doris的那些基本概念
    bash常见用法
    sonar p3c规则配置
    sonar之gitlab ci 在gradle项目的实践(汉化、branch、 commit提交评论)
  • 原文地址:https://www.cnblogs.com/dancer16/p/7352884.html
Copyright © 2011-2022 走看看