zoukankan      html  css  js  c++  java
  • [bzoj2456] mode

    题目描述

    给你一个n个数的数列,其中某个数出现了超过n div 2次即众数,请你找出那个数。

    输入格式

    第1行一个正整数n。
    第2行n个正整数用空格隔开。

    输出格式

    一行一个正整数表示那个众数。

    样例

    INPUT

    5
    3 2 3 1 3

    OUTPUT

    3

    HINT

    对于100%的数据,n<=500000,数列中每个数<=maxlongint。

    本题时限1sec,空限1M(???)

    SOLUTION

    一开始直接map一发,空间写挂;以为是map的锅,就又用了hash(???就T掉了(而且map都挂了,hash能过???

    于是发现空限是1M.

    重新看题。

    可以发现这里的“众数”和我们平常定义的众数有不一样的地方:出现次数超过(lfloorfrac n2 floor)

    所以,不难得出,最坏情况下,依然有:组成最长连续相等区间一定是我们要的“众数”。

    于是代码:

    #include <cstdio>
    using namespace std;
    int n,x,lst,itv;
    int main(){
    	scanf("%d",&n);
    	while(n--){
    		scanf("%d",&x);
    		if (x==lst) ++itv;
    		else if (!itv) {lst=x;itv=1;} else --itv;}
    		//直到有另一区间长度比当前长再更新答案 
    	printf("%d",lst);
    	return 0; 
    }
    

    还有一件事,不要写多余的头文件在前面,我之前就多了个<iostream>,会MLE的。

  • 相关阅读:
    【中山纪念中学六年级模拟赛】方格翻转 题解
    高斯消元
    net 控件开发资料
    使用自定义验证组件库扩展 Windows 窗体
    POJ 3032
    UVa 10878 Decode the tape
    C语言I博客作业03
    第十周助教总结
    第十二周助教总结
    C语言I博客作业06
  • 原文地址:https://www.cnblogs.com/hkpls/p/9781603.html
Copyright © 2011-2022 走看看