[51nod1786]数据流中的算法 - 众数

395人阅读 评论(0) 收藏 举报
分类:

题目描述

数据流统计功能上线后,为51nod提升用户体验做出了很大的贡献。但是新问题随之而来,夹克老爷还想知道在一个窗口内,访问次数最多用户(即窗口内的众数)。如果有多个众数,取用户ID最小的一个。(窗口的意思是一个固定长度的区间!)

(因为数据流是实时的、在线的,所以不允许使用离线算法^_^)

做法

一个map+一个set

#include<cstdio>
#include<algorithm>
#include<set>
#include<map>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
struct dong{
    int x,y;
    friend bool operator <(dong a,dong b){
        return a.x>b.x||a.x==b.x&&a.y<b.y;
    }
} zlt;
map<int,int> f;
multiset<dong> s;
int a[5000000+10],sta[80];
int i,j,k,l,t,n,m,tot,top;
int read(){
    int x=0,f=1;
    char ch=getchar();
    while (ch<'0'||ch>'9'){
        if (ch=='-') f=-1;
        ch=getchar();
    }
    while (ch>='0'&&ch<='9'){
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
void ins(int x){
    if (f[x]){
        zlt.x=f[x];
        zlt.y=x;
        s.erase(s.find(zlt));
    }
    f[x]++;
    zlt.x=f[x];
    zlt.y=x;
    s.insert(zlt);
}
void del(int x){
    zlt.x=f[x];
    zlt.y=x;
    s.erase(s.find(zlt));
    f[x]--;
    if (f[x]){
        zlt.x=f[x];
        zlt.y=x;
        s.insert(zlt);
    }
}
void write(int x){
    if (!x){
        putchar('0');
        putchar('\n');
        return;
    }
    top=0;
    while (x){
        sta[++top]=x%10;
        x/=10;
    }
    while (top) putchar('0'+sta[top--]);
    putchar('\n');
}
int main(){
    n=read();k=read();
    tot=0;
    fo(i,1,n){
        t=read();
        if (t==1){
            a[++tot]=read();
            if (tot>k) del(a[tot-k]);
            ins(a[tot]);
        }
        else write((*s.begin()).y);
    }
}
查看评论

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

set+map
  • SenyeLicone
  • SenyeLicone
  • 2017-06-28 19:48:42
  • 365

寻找众数算法

寻找众数是常见的算法,这里的总数是指出现次数大于一半的数。常见的解决办法有如下几种:1.逐个统计每个数出现的次数,时间复杂度为O(n*n)(n*(n-1)/2+n),n指数组元素的个数。2.对数组进行...
  • cblou
  • cblou
  • 2011-07-27 14:53:48
  • 3009

(七)一个寻找数组中众数的算法

Given an array of size n, find the majority element. The majority element is the element that appear...
  • qixinbruce
  • qixinbruce
  • 2016-04-14 00:15:02
  • 3498

51Nod数据流中的算法—众数

数据流统计功能上线后,为51nod提升用户体验做出了很大的贡献。但是新问题随之而来,夹克老爷还想知道在一个窗口内,访问次数最多用户(即窗口内的众数)。如果有多个众数,取用户ID最小的一个。(窗口的意思...
  • qq_34143240
  • qq_34143240
  • 2017-08-02 14:59:46
  • 79

简单找众数算法详解

众数的定义: 是一组数据中出现次数最多的数值,叫众数,有时众数在一组数中有好几个。用M表示。 理性理解:简单的说,就是一组数据中占比例最多的那个数。 例题: 剧中比赛全球大学生都参加了编号从-10...
  • liujian20150808
  • liujian20150808
  • 2016-02-05 12:26:36
  • 4757

求序列中的众数

描述 输入一个长度为N的整数序列 (不多于128个整数),每个整数的范围在[-1052,1052],计算这个序列的众数。 众数是指出现次数最多的那个数。 如果有多个数出现的...
  • WenOOI
  • WenOOI
  • 2018-03-17 15:37:46
  • 39

绝对众数的求法

绝对众数是指在数列 p中出现次数严格大于|p|/2的数。 求绝对众数的几种方法: (1)快速排序 快速排序之后在数列中间的数是绝对众数 (2)摩尔投票法 摩尔投票法的基本思想很容易理解,在每...
  • lion19930924
  • lion19930924
  • 2016-07-21 14:43:04
  • 522

众数问题 算法分析与设计

  • 2010年05月13日 18:17
  • 3KB
  • 下载

c++实现求众数及其重数

问题:在一个由元素组成的表中,出现次数最多的元素称为众数,试写一个寻找众数的算法 方法:1)对输入数据进行排序              2)从每个数字出现的第一个位置开始计数,计算出现的次数,记为c...
  • bwangk
  • bwangk
  • 2016-09-09 15:03:20
  • 4030

算法之绝对众数

算法之绝对众数
  • u013473520
  • u013473520
  • 2016-02-28 20:56:19
  • 1148
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 39万+
    积分: 1万+
    排名: 1455
    最新评论
    文章分类