数据流中的算法
题目
数据流中的算法
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;
}