Bzoj 2456: mode 数论,众数
2456: mode
Time Limit: 1 Sec Memory Limit: 1 MBSubmit: 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
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 }