Bzoj2456 mode

Bzoj2456 mode

Position:


List

Description

  • 給你一個n個數的數列,其中某個數出現了超過n div 2次即衆數,請你找出那個數。

Solution

衆數出現的次數>=n/2+1,採用抵消的方法,如果當前數不等於之前記錄的數給計數器-1 else +1,當計數器<=0時,可以update數。
證明:對於每一個不是衆數的數,它一定會被抵消完。剩下的數衆數的個數最多減去前面個數/2,所以個數仍大於剩下的數的1/2。如果當前找到的數的衆數,那麼接下來它就不會被抵消掉。

Code

// <mode.cpp> - 07/28/16 19:34:21
// This file is made by YJinpeng,created by XuYike's black technology automatically.
// Copyright (C) 2016 ChangJun High School, Inc.
// I don't know what this program is.

#include <cstdio>
using namespace std;
int n,k,ans,now;
int main()
{
    freopen("mode.in","r",stdin);
    freopen("mode.out","w",stdout);
    scanf("%d",&n);
    scanf("%d",&now);
    k=0;ans=now;
    for(int i=2;i<=n;i++){
        scanf("%d",&now);
        if(now==ans)k++;else k--;
        if(k<=0)ans=now,k=1;
    }
    printf("%d",ans);
    return 0;
}

這裏加一個讀入輸出優化,192MS。提高Rank。

// <mode.cpp> - 07/28/16 19:34:21
// This file is made by YJinpeng,created by XuYike's black technology automatically.
// Copyright (C) 2016 ChangJun High School, Inc.
// I don't know what this program is.
#include <cstdio>
using namespace std;
int n,k,ans,now;
int w;char ch;
inline int getint(){
    ch=getchar();w=0;
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')w=w*10+ch-'0',ch=getchar();
    return w;
}
inline void Plus(int a){
    if(a>=10)Plus(a/10);
    putchar(a%10+'0');
}
int main()
{
    n=getint();now=getint();
    k=0;ans=now;
    for(int i=2;i<=n;i++){
        now=getint();
        if(now==ans)k++;else k--;
        if(k<=0)ans=now,k=1;
    }
    Plus(ans);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章