数据流中的算法
题目
数据流中的算法 
 Wizmann (命题人) 
 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 20 
 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
解题思想
模拟即可,注意精度用double
代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn = 1e6+5;
int a[maxn], b[maxn];
int main()
{
    memset(a,-1,sizeof(a));
    int n,k;
    int m,v;
    int coun = 0; //统计实际需要求平均的个数
    int index = 1; 
    int sum = 0;
    scanf("%d%d",&n,&k);
    while(n--)
    {
        scanf("%d",&m);
        if(m == 1){
           scanf("%d",&v);
           sum += v-max(0,a[index]); //如果为-1,说明此位置没值,否则有值,将其减去
           if(a[index]==-1){ //没值才计数
              coun++;
           }
           a[index++]=v;
           if(index > k){ //超过窗口,则重新开始
            index = 1;
           }
        }
        else if(m == 2){
            int ant = sum/coun;
            printf("%.2lf\n",ant*1.0);
        }
        else if(m == 3){
            double ant = sum*1.0/coun;
            double sum = 0;
            for(int i=1; i<=k; ++i){
                if(a[i]!=-1){
                    sum += (a[i]-ant)*(a[i]-ant);
                }
            }
            printf("%.2lf\n", sum*1.0/coun);
        }
        else if(m == 4){
            int c = 0;
            for(int i=1; i<=k; ++i){
                if(a[i] != -1){
                    b[++c] = a[i];
                }
            }
            sort(b+1,b+c+1);
            printf("%.2lf\n",(b[(c+1)/2]+b[c/2+1])/2.0);
        }
    }
    return 0;
} 查看12道真题和解析
查看12道真题和解析