1.题意:第一行一个数字N,表示一共有多少个数字,第二行N个数字,保证其中至少有一个数字出现次数超过一半,任务是求出这个出现最多的数。

2.分析:本题是明显的求众数的问题,常规思路为开一个大数组,在读入数据的同时统计数据出现的次数,最后遍历出众数,显然的提交之后会MLE,因为题面上的数据范围为:

40%的数据满足(n<=100)
60%的数据满足(n<=1000000),内存大小限制128Mb
70%的数据满足(n<=1000000),内存大小限制3Mb
100%的数据满足(n<=1000000),且所使用内存大小不能超过1Mb

所有输入数字为小于1000000007的非负整数。

那么这里提供一个新的思路:即不用数组统计出现次数,因为最终关注的只是众数,无需记录所有信息。

考察绝对众数的两个性质:(1)众数的出现次数严格大于总数字的一半;(2)删除数组中两个不同的数,绝对众数不变

通过不断删除两个不同的数,最终剩下一个或者两个数的时候,留下的一定是单独的一个绝对众数(数组有奇数个数)或者两个绝对众数(数组有偶数个数)

具体操作是维护两个变量num以及temp分别表示临时众数与当前读入的数字,一个num_cnt表示已经遇到的临时众数的数量

当num != temp 则忽略这两个数:temp继续读入下一个数。num_cnt--

当num = temp 则忽略temp,增加num的个数:temp继续读入下一个数,num_cnt++

当num_cnt为0,选取下一个temp为num

代码如下:

 # include <iostream>
# include <cstdio>
using namespace std;
int N;
int main()
{
while(scanf("%d",&N)!=EOF)
{
int num;
int num_cnt=;
scanf("%d",&num);
for(int i=;i<N;i++)
{
int temp;
scanf("%d",&temp);
if(num_cnt==)
{
num=temp;
num_cnt=;
continue;
}
if(temp==num)
num_cnt++;
else
num_cnt--;
}
printf("%d\n",num);
}
return ;
}

最新文章

  1. 视图UIView的大小和位置属性详解
  2. PAT 1072. Gas Station (30)
  3. python built-in zip()
  4. svn的安装配置
  5. 打通多个帝国CMS系统的会员整合与同步教程
  6. Spring 定时执行任务
  7. Linux下查看每个目录所占用空间大小的命令
  8. 如何为PHP贡献代码
  9. System.Web.HttpContext.Current.Session获取值出错
  10. centos6.4、6.5、7.0环境下载及安装
  11. CCFlow最近在山东济南总部举行组团培训活动,有參加的能够报名
  12. 2018-01-03 烂尾工程: Java实现的汇编语言编译器
  13. html中用href 实现点击链接弹出文件下载对话框
  14. linux下安装mysql(rpm文件安装)
  15. 将 GitHub 的某人的特定仓库复制到自己的账户下 的方法
  16. 【微信小程序】tabBar的显示问题
  17. RTC(x86)
  18. C# 文本框只能输入数字和退格键 (转)
  19. react onclick传递参数
  20. spring mvc整合mybaitis和log4j

热门文章

  1. jsp项目中整个项目没有问题但是servlet报错
  2. 使用 UIWebView 来播放视频
  3. Cython保护Python代码
  4. myeclipse2013在线安装svn
  5. SharpDX初学者教程第2部分:创建窗口
  6. D-query SPOJ - DQUERY 主席树查询区间内不同数出现的次数
  7. APICloud修改最低操作系统版本要求
  8. html前端登录验证
  9. HTML5的5个的新特性
  10. 2017年NOIP普及组复赛题解