首页 > 代码库 > Vijos1917 艾酱最喜欢的数字 求众数
Vijos1917 艾酱最喜欢的数字 求众数
1.题意:第一行一个数字N,表示一共有多少个数字,第二行N个数字,保证其中至少有一个数字出现次数超过一半,任务是求出这个出现最多的数。
2.分析:本题是明显的求众数的问题,一般是开一个大数组,在读入数据的同时统计数据出现的次数,最后遍历出众数,但是常规做法提交之后会MLE,因为题面上的数据范围为:
40%的数据满足(n<=100)
60%的数据满足(n<=1000000),内存大小限制128Mb
70%的数据满足(n<=1000000),内存大小限制3Mb
100%的数据满足(n<=1000000),且所使用内存大小不能超过1Mb
所有输入数字为小于1000000007的非负整数。
所以不能开大数组,那么这里提供一个新的思路:即不用数组统计出现次数,因为最终关注的是出现字数最多的。
具体算法为,循环中不断读入数字,且维护两个变量,num与num_cnt,分别表示当前处理的数字,以及当前处理数字的“生命值”,即读入数字为num,生命值+1,非num则生命值-1,当生命值为0则将num替换成当前被读入的数字,最后num表示的数字一定是所求的众数,因为众数的出现次数严格大于总数字的一半
代码如下:
1 # include <iostream>//其实就是打擂台 2 # include <cstdio> 3 using namespace std; 4 int N; 5 int main() 6 { 7 while(scanf("%d",&N)!=EOF) 8 { 9 int num; 10 int num_cnt=1; 11 scanf("%d",&num); 12 for(int i=1;i<N;i++) 13 { 14 int temp; 15 scanf("%d",&temp); 16 if(num_cnt==0) 17 { 18 num=temp; 19 num_cnt=1; 20 continue; 21 } 22 if(temp==num) 23 num_cnt++; 24 else 25 num_cnt--; 26 } 27 printf("%d\n",num); 28 } 29 return 0; 30 }
Vijos1917 艾酱最喜欢的数字 求众数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。