zoukankan      html  css  js  c++  java
  • 【洛谷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;
    }
    
  • 相关阅读:
    有关选择的心法(2)
    系统故障排查和确认是否被入侵
    伪善还是妥协
    建恒信安日志审计部署
    有关选择的心法
    数据统治世界----37%原则
    控制二分法
    磁盘空间耗尽导致服务器无法启动
    Linux 标准目录结构 FHS
    Linux入侵类问题排查思路
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998458.html
Copyright © 2011-2022 走看看