[bzoj2456]mode

来自FallDream的博客,未经允许,请勿转载,谢谢。


给定n个数,其中有一个数出现次数大于n/2,输出那个数  内存1MB

题解:先记下第一个数和此时的出现次数(一开始是1),然后一个个往后处理,如果这个数和现在几下的数不同,那么出现次数-1,否则出现次数+1。如果出现次数变为0,则把记下的数字改成现在这个数,这样一定能找到那个数。

比如3 2 4 3 3    (3,1)->(2,1)->(4,1)->(3,1)->(3,2),找到了数字3

只能卡到40ms不知道rank1怎么卡到的36ms

#include<cstdio>
using namespace std;
char B[1<<15],*S=B,*T=B,C;int X;
#define getc() (S==T&&(T=((S=B)+fread(B,1,1<<15,stdin)),S==T)?0:*S++)
inline  int read()
{ 
    X=0;C=getc();
    while(C < '0' || C > '9'){ C = getc();}
    while(C >= '0' && C <= '9'){X = X * 10 + C - '0';C = getc();}
    return X;
}
int n,a,b,x;
int main()
{
    n=read();a=read();b=1;
    for(register int i=2;i<=n;++i)
        x=read(),
        x==a?++b:--b,
        b?0:(a=x,b=1);
    printf("%d",a);
    return 0;
}

 

posted @ 2017-04-07 13:43  FallDream  阅读(211)  评论(0编辑  收藏  举报