Bzoj 2456: mode 数论,众数

2456: mode

Time Limit: 1 Sec  Memory Limit: 1 MB
Submit: 2843  Solved: 1202
[Submit][Status][Discuss]

Description

给你一个n个数的数列,其中某个数出现了超过n div 2次即众数,请你找出那个数。

Input

第1行一个正整数n。
第2行n个正整数用空格隔开。

Output

    一行一个正整数表示那个众数。

Sample Input

5
3 2 3 1 3

Sample Output

3

HINT

 

100%的数据,n<=500000,数列中每个数<=maxlongint。


 


zju2132 The Most Frequent Number

 

Source

鸣谢 黄祎程

题解:

这道题内存给的实在是。。。

我不会告诉你 #include<bits/stdc++.h> 过不了。。。

只有用 #include<cstdio> 或 #include<stdio.h> 。。。

因为题目中说了这个数一定会出现*超过*n div 2 次。

例如样例:

3 2 3 1 3

我们可以把不相等的抵消。

3 - 2

3 - 1

剩下了一个3,即为众数。

然后从头到尾边输入,边判断是否和当前的数相等,相等就++,不相等就--。

加了读入优化更好呦~~~

 1 #include<cstdio>
 2 int read()
 3 {
 4     int s=0,fh=1;char ch=getchar();
 5     while(ch<'0'||ch>'9'){if(ch=='-')fh=-1;ch=getchar();}
 6     while(ch>='0'&&ch<='9'){s=s*10+(ch-'0');ch=getchar();}
 7     return s*fh;
 8 }
 9 int main()
10 {
11     int s=0,k=0,n;
12     n=read();
13     while(n--)
14     {
15         int a;
16         a=read();
17         if(k==0)s=a;
18         if(s==a)k++;
19         else k--;
20     }
21     printf("%d",s);
22     return 0;
23 }

 

posted @ 2016-03-24 14:06  微弱的世界  阅读(245)  评论(0编辑  收藏  举报