码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷 P2397 yyy loves Maths VI (mode) 题解

时间:2017-10-11 11:11:16      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:大于   否则   3.5   ios   style   strong   amp   std   位置   

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。

题目链接:https://www.luogu.org/problem/show?pid=2397

题目背景

自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居然也不会,所以只好找你

题目描述

[h1]udp2:第一题因为语言性质问题,比赛结束后将所有c/c++的程序的内存调为2.2mb后重测。[/h1]

他让redbag找众数

他还特意表示,这个众数出现次数超过了一半

一共n个数,而且保证有

n<=2000000

而且每个数<2^31-1

输入输出格式

输入格式:

第一行一个整数n

第二行n个整数

输出格式:

一行,这个众数

输入输出样例

输入样例#1:
5
2 3 3 3 3
输出样例#1:
3

说明

时间限制 1s

空间限制 3.5M(你没看错3.5M)

有人想水过,但我告诉你这空间是不够的

//kkksc03偷偷地说:你随便输出一个数字吧,都有1/2的几率。不过这可是乐多赛,值得不值得你看着办。所以最好想一想正解。

 

分析:

这题的空间很小,是不可能把所有数读下来排序的。

由于众数的出现次数大于总数的一半,可以在读入过程中假定当前的数是众数,如果下一个数与它相等,cnt++,否则cnt--.

如果cnt<0,说明当前数被抵消没了,再假定一个新的众数继续抵消。

相当于用众数去抵消其他的数。由于众数出现次数大于一半,所以无论如何最后都能剩下众数。

以及这题快读会T2个点,要写scanf。简直有毒。

 

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm> 
 5 
 6 int n,now,x,cnt = 1;
 7 
 8 int main()
 9 {
10     scanf("%d%d",&n,&now);
11     for(int i = 2;i <= n;++ i)
12     {
13         scanf("%d",&x);
14         if(x != now) cnt --;
15         else    cnt ++;
16         if(cnt < 0) cnt = 1,now = x;
17     }
18     printf("%d\n",now);
19     return 0;
20 }

 

 

洛谷 P2397 yyy loves Maths VI (mode) 题解

标签:大于   否则   3.5   ios   style   strong   amp   std   位置   

原文地址:http://www.cnblogs.com/shingen/p/7648775.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!