洛谷 P2397 yyy loves Maths VI (mode) 题解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P2397 yyy loves Maths VI (mode) 题解相关的知识,希望对你有一定的参考价值。
此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。
题目链接: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个整数
输出格式:一行,这个众数
输入输出样例
5 2 3 3 3 3
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) 题解的主要内容,如果未能解决你的问题,请参考以下文章
Luogu P2397 yyy loves Maths VI (mode)