51nod 1785 数据流中的算法

来源:互联网 发布:js省市区三级联动代码 编辑:程序博客网 时间:2024/06/02 06:55

这题看了好多遍,才看懂题目中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;}
原创粉丝点击