洛谷 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个整数

输出格式:

一行,这个众数

输入输出样例

输入样例#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) 题解的主要内容,如果未能解决你的问题,请参考以下文章

Luogu P2397 yyy loves Maths VI (mode)

题解Luogu P2397 yyy loves Maths VI (mode)

洛谷——P2393 yyy loves Maths II

洛谷 P2393 yyy loves Maths II

luogu2393 yyy loves Maths II

P2393 yyy loves Maths II