【题解】Luogu P2397 yyy loves Maths VI (mode)

problem

很有意思的一道题

Solution

初看此题毫无头绪,2.2mb太丧心病狂了

再看题目,注意到重要性质:众数个数大于一半

看完题解之后想到使用一个方法:摩尔投票法

摩尔投票法是啥玩意?

考虑一段序列,其中众数的个数超过一半

每一轮投票,从序列中选出两个不同的数,丢弃

无法再进行投票后,最终一定剩下大于等于一个全部相同的数,即众数

会不会有剩两种或以上不同的数?

不会。根据定义,此时我们还可以再进行一次投票

很好,可是要怎么用到题目上面?

十分极限的空间限制要求我们的算法空间复杂度为\(O(1)\)

以下引用自PauGasol的高票题解

我们来yy一个小房子,每当有数进来的时候,如果房子是空的,那么将这个房子贴上自己的标签。

如果房子里已经有和自己相同数字了,那么进去和它一起♂住。

如果房子里有和自己不同的数字,带一个走出♂房♂子。

最后房子里还剩下的数一定就是众数了。

生动形象,惊世骇俗,一针见血(bushi

实际上这就是在运用摩尔投票法了,每次走出去的两个数字是不同的,最终剩下的数即是众数

Code

#include <cstdio>
using namespace std;

int n;
int cur,cnt;

int main()
{
    scanf("%d",&n);
    int t;
    for(register int i=1;i<=n;++i)
    {
        scanf("%d",&t);
        if(!cnt)
            cur=t;
        if(cur==t)
            ++cnt;
        else
            --cnt;
    }
    printf("%d",cur);
} 

Solution II

在我把这道题直球安利给机房P神@srydsf123之后,P神花了三秒钟稍作思考,说我还是\(naive\),提出了一个跟位有点关系的解决方案

数组\(cnt[i][j]\)表示第\(i\)位上为\(j\)的数字的个数

可以发现众数各位上的各个数在所在位上的个数一定大于\(n/2\),且在所有数中个数最多

为什么最多?

显然其他的数字的个数一定小于\(n/2\)

Code

懒得打了

原文地址:https://www.cnblogs.com/lizbaka/p/10246439.html

时间: 2024-08-01 03:59:22

【题解】Luogu P2397 yyy loves Maths VI (mode)的相关文章

luogu P2397 yyy loves Maths VI (mode)

题目背景 自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居然也不会,所以只好找你 题目描述 [h1]udp2:第一题因为语言性质问题,比赛结束后将所有c/c++的程序的内存调为2.2mb后重测.[/h1] 他让redbag找众数 他还特意表示,这个众数出现次数超过了一半 一共n个数,而且保证有 n<=2000000 而且每个数<2^31-1 输入输出格式 输入格式: 第一行一个整数n 第二行n个整数 输出格式: 一行

洛谷——P2393 yyy loves Maths II

P2393 yyy loves Maths II 题目背景 上次蒟蒻redbag可把yyy气坏了,yyy说他只是小学生,蒟蒻redbag这次不坑他了. 题目描述 redbag给了yyy很多个数,要yyy计算这些数的和.必须要快,redbag只给了yyy1秒的时间!!! 输入输出格式 输入格式: 一行,很多个数 输出格式: 一行,一个实数(四舍五入精确到5位小数),表示这些数的和. 输入输出样例 输入样例#1: 复制 1 输出样例#1: 复制 1.00000 说明 [数据规模] 对于100%的数据

洛谷 P2393 yyy loves Maths II

P2393 yyy loves Maths II 题目背景 上次蒟蒻redbag可把yyy气坏了,yyy说他只是小学生,蒟蒻redbag这次不坑他了. 题目描述 redbag给了yyy很多个数,要yyy计算这些数的和.必须要快,redbag只给了yyy1秒的时间!!! 输入输出格式 输入格式: 一行,很多个数 输出格式: 一行,一个实数(四舍五入精确到5位小数),表示这些数的和. 输入输出样例 输入样例#1: 复制 1 输出样例#1: 复制 1.00000 说明 [数据规模] 对于100%的数据

$题解 P2394 【yyy loves Chemistry I】$

$ P2394 ?yyy ?loves ? Chemistry ?I$ 感觉这道题没这么难啊?本蒟蒻还是很疑惑,为什么评分为普及+/提高呢? 好了,废话不多说,一起愉快地做题吧! \[First:\text{输入}\] 我相信,第一次做题的时候,大多数的人都会这么输入 scanf("%Lf",&a); 但这么输入是错误的,为什么呢?因为\(a\)的精度你无法确定,而long double的精度只有\(18-19\)位. 那怎么办呢?别急别急,喝口茶慢慢说,好在scanf可以强制

luogu2393 yyy loves Maths II

使用long double #include <iostream> #include <cstdio> using namespace std; long double ans=0.0, xx; int main(){ while(scanf("%Lf", &xx)!=EOF) ans = ans + xx * 1000000; printf("%.5Lf", ans/1000000); return 0; } 原文地址:https:

[洛谷1580]yyy loves Easter_Egg I

题目背景 Soha的出题效率着实让人大吃一惊.OI,数学,化学的题目都出好了,物理的题还没有一道.于是,Huntfire,absi2011,lanlan对soha进行轮番炸,准备炸到soha出来,不料,人群中冲出了个kkksc03…… 题目描述 yyy loves OI(Huntfire),yyy loves Maths(lanlan),yyy loves Chemistry(absi2011)对yyy loves Physics(soha)进行轮番炸,轰炸按照顺序进行,顺序为Huntfire,

yyy loves Easter_Egg I(恶心的字符串模拟)

题目背景 Soha的出题效率着实让人大吃一惊.OI,数学,化学的题目都出好了,物理的题还没有一道.于是,Huntfire,absi2011,redbag对soha进行轮番炸,准备炸到soha出来,不料,人群中冲出了个kkksc03…… 题目描述 yyy loves OI(Huntfire),yyy loves Maths(redbag),yyy loves Chemistry(absi2011)对yyy loves Physics(soha)进行轮番炸,轰炸按照顺序进行,顺序为Huntfire,

[洛谷P1580]yyy loves Easter_Egg I

题目大意:很多人@一个人,如果那个人忍不住说话了,就轰炸成功,如果那个人没说话或者别的人没有@他或@很多个人,则轰炸失败.(具体见原题) 解题思路:字符串处理,好好用sscanf即可(细节见代码). C++ Code: #include<cstring> #include<algorithm> #include<cstdio> char s[1050],zha[1050],shuohua[1050],At[1050]; int q=1; int main(){ fget

bzoj3561DZY Loves Math VI

3561: DZY Loves Math VI Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 503  Solved: 333[Submit][Status][Discuss] Description 给定正整数n,m.求 Input 一行两个整数n,m. Output 一个整数,为答案模1000000007后的值. Sample Input 5 4 Sample Output 424 HINT 数据规模: 1<=n,m<=500000,共有3