您的位置:首页 > 其它

51nod 1785 数据流中的算法

2017-08-03 22:59 381 查看
这题看了好多遍,才看懂题目中k的意思,k就是每次计算最多只能到k个人

坑点是平均数那里,在计算平均数的时候,输出平均数的时候要向下取整,然后输出的时候还要保留两位小数,然而计算方差的时候,那个平均数就不能向下取整了,否则就错了。

#include <stdio.h>
#include <vector>
#include <algorithm>

const int MAXN = 1e6+10;
int que[MAXN];
int prefixSum[MAXN];
int head = 1;
int tail = 1;

int main()
{
int op,n,k,sum,ave;
scanf("%d %d",&n,&k);
while(n--)
{
scanf("%d",&op);
if(op == 1)
{
scanf("%d",&que[tail++]);
prefixSum[tail-1] += prefixSum[tail-2]+que[tail-1];
if(tail - head > k)
head++;
}
else if(op == 2)
{
sum = prefixSum[tail-1]-prefixSum[head-1];
ave = sum/(tail-head);
printf("%.2lf\n",(double)ave);
}
else if(op == 3)
{
double dsum = prefixSum[tail-1]-prefixSum[head-1];
double dave = dsum/(tail-head);
double res = 0;
for(int i = head; i < tail; ++i)
res += ((double)que[i]-dave)*((double)que[i]-dave);
res /= (tail-head);
printf("%.2lf\n",res);
}
else
{
std::vector<double> temp;
for(int i = head; i < tail; ++i)
temp.push_back(que[i]);
std::sort(temp.begin(),temp.end());
int len = temp.size();
if(len%2 == 1)
printf("%.2lf\n",temp[len/2]);
else
printf("%.2lf\n",(temp[len/2]+temp[len/2-1])/2.0);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: