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\n",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\n",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\n",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\n",double(i));else printf("%.2f\n",(last+i)/2.0);    
            }    
        }    
    }
}
 

PS:stdio.h真的快

posted @ 2017-08-13 11:53  dancer16  阅读(206)  评论(0编辑  收藏  举报
描述