• 【洛谷P2397】yyy loves Maths VI (mode)【模拟】


    题目大意:

    题目链接:https://www.luogu.org/problemnew/show/P2397
    给出长度为nn的数列,其中的众数个数超过了一半。求这个众数。


    思路:

    数据范围要求在O(n)O(n)的时间复杂度内完成。
    那么排序和mapmap,离散这些nlognnlogn的可以拜拜了。
    那么自然就要分析一下“众数个数超过一半”这个条件了。
    我们不难发现,一个数列众数超过了一半,那么在这个数列里去掉任意两个不相等的数字,剩余的数字中的众数肯定也超过了一半!
    但是怎么在这个数列中O(1)O(1)找到两个不相等的数呢?
    显然是不可能的。
    那么可以换一种方式看问题:
    假设我们已经知道前i1i-1个数的众数和出现次数了,那么现在读入第ii个数,如果第ii个数之前的众数一样,那么就将数量加11,如果和之前的众数不一样,那么众数个数就减11,相当于去掉两个不相等的数(一个众数和一个不等于众数的数)。
    那么最终留下来的众数就是答案了。
    时间复杂度O(n)O(n)


    代码:

    #include <cstdio>
    using namespace std;
    
    int n,ans,sum,x;
    
    int main()
    {
    	scanf("%d",&n);
    	while (n--)
    	{
    		scanf("%d",&x);
    		if (!sum)  //前面的数都被消除完了,说明没有众数
    		{
    			ans=x;
    			sum++;
    		}
    		else if (ans==x) sum++;
    		else sum--;
    	}
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    <锋利的jQuery>读书笔记
    OpenStack虚拟机冷迁移与热迁移
    oh-my-zsh安装和简单定制
    sqlalchemy查询结果类型简析
    python 错误捕获机制分析
    《JavaScript.DOM》读书笔记
    <HTML深入浅出> 读书笔记
    Python多任务—进程
    Python多任务—线程
    Go的流程控制
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998457.html
Copyright © 2020-2023  润新知