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真的快

时间: 2024-10-16 15:52:33

51nod1785数据流中的算法的相关文章

51Nod1785 数据流中的算法

Problem 51nod近日上线了用户满意度检测工具,使用高级人工智能算法,通过用户访问时间.鼠标轨迹等特征计算用户对于网站的满意程度. 现有的统计工具只能统计某一个窗口中,用户的满意程度的均值.夹克老爷想让你为统计工具添加一个新feature,即在统计均值的同时,计算窗口中满意程度的标准差和中位数(均值需要向下取整). Solution 方差转化为均值相减,均值维护,中位数multiset维护每次找. 还有双堆维护中位数,QAQ. Code #include<stdio.h> #inclu

51Nod - 1786 数据流中的算法 - 众数

1786 数据流中的算法 - 众数 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 数据流统计功能上线后,为51nod提升用户体验做出了很大的贡献.但是新问题随之而来,夹克老爷还想知道在一个窗口内,访问次数最多用户(即窗口内的众数).如果有多个众数,取用户ID最小的一个.(窗口的意思是一个固定长度的区间!) (因为数据流是实时的.在线的,所以不允许使用离线算法^_^) Input 第一行为整数n, k.(1 <= n <= 5 * 10^6,1 <

【51nod 1785】数据流中的算法

Description 51nod近日上线了用户满意度检测工具,使用高级人工智能算法,通过用户访问时间.鼠标轨迹等特征计算用户对于网站的满意程度. 现有的统计工具只能统计某一个窗口中,用户的满意程度的均值.夹克老爷想让你为统计工具添加一个新feature,即在统计均值的同时,计算窗口中满意程度的标准差和中位数(均值需要向下取整). Input 第一行是整数n与k,代表有n次操作,时间窗口大小为k.  (1 <= n <= 10^6, 1 <= k <= 100) 接下来的n行,每行

【51NOD】数据流中的算法

[算法]数学 [题解] 1.平均数:累加前缀和.//听说要向下取整? 2.中位数:双堆法,大于中位数存入小顶堆,小于中位数存入大顶堆,保证小顶堆内数字数量≥大顶堆,奇数则取小堆顶,偶数则取两堆顶/2. 3.方差=(平方的均值)-(均值的平方),即对于a,b,c,s2=(a2+b2+c2)/3-((a+b+c)/3)2.

剑指offer63:数据流中的中位数

题目描述: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 本题最开始简单的理解为求中位数,使用的是快排的思想,当数据元素为奇数个时,求第n/2大的数,当元素个数为偶数时,先求n/2个数,然后对右边的求出一个最小值. 看了别人的做法,发现应该把这道题理解为一个在线算法题.关键是使用两个堆,最大化堆存储前n/2个数,最小化堆存储后n/2个数,当元素个数为偶数个

《剑指offer》:[64]数据流中的中位数

题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数据排序后中间两个数的平均值. 例如:1,2,3,4,5的中位数为:3.1,2,3,4的中位数为:(2+3)/2=3. 方案一:采用Partition来解决.在[29]中我们讲过,快速查找中的Partition函数是十分重要,是一个比较常用的算法.所以这里我们采用partion函数来解决.从字符流里读字符,插入到一个无需的数组中的复杂度为

64 - 数据流中的中位数 || STL 堆

题目: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 思路解析 数据是从数据流读出,因此数组的个数是再逐渐的增加.如何选用一个容器,能够存储数据,并能够给出中位数. 无序数组:插入O(1) partation操作找出中位数 O(n) 有序数组:插入O(n) 找出中位数O(1) 有序链表:插入O(n) 找出中位数O(1) 搜索二叉树:插入O(logn)~O(

剑指offer:数据流中的中位数

题目描述: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数. 思路分析: 思路一:最朴素的想法,用一个vector来存输入的数据流.在取中位数的函数中,每次对数据流进行一次排序,对于奇数长度的数据,直接取中间值,对于偶数长度的数据,取中间两个数的平均值.很显然,这个

《剑指offer》第四十一题:数据流中的中位数

// 面试题41:数据流中的中位数 // 题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么 // 中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值, // 那么中位数就是所有数值排序之后中间两个数的平均值. #include <cstdio> #include <algorithm> #include <vector> #include <functional> using namespace std; templ