• 【bzoj5094】硬盘检测 乱搞


    题目描述

    已知从 $n$ 个不同的32位无符号整数中随机选 $m=10000$ 次所得的结果,求可能性最大的 $n$ ,其中 $n=10^k,1le kle 7$。

    输入

    第一行包含一个正整数m(m=10000),表示随机访问硬盘的次数。

    接下来m行,每行一个整数a_i(0<=a_i<2^{32}),即每次随机访问读取的结果。

    输出

    输出一行一个整数,即n的大小。


    题解

    乱搞

    由于 $n$ 的跨度很大,因此可以在本机随机生成多组情况,根据情况的分布推断出 $n$ 的大小。

    标算采取的时平均每个数的出现次数,我采取的是出现次数最多的数的出现次数以及这样的数的个数。这两种方法均可通过本题。

    时间复杂度 $O(mlog m)$

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    unsigned a[10010];
    int main()
    {
        int n , i , now = 1 , mx = -1 , mc;
        scanf("%d" , &n);
        for(i = 1 ; i <= n ; i ++ ) scanf("%u" , &a[i]);
        sort(a + 1 , a + n + 1);
        for(i = 2 ; i <= n ; i ++ )
        {
            if(a[i] == a[i - 1]) now ++ ;
            else
            {
                if(mx < now) mx = now , mc = 1;
                else if(mx == now) mc ++ ;
                now = 1;
            }
        }
        if(mx < now) mx = now;
        else if(mx == now) mc ++ ;
        if(mx >= 1000) puts("10");
        else if(mx >= 100) puts("100");
        else if(mx >= 15) puts("1000");
        else if(mx > 5 || (mx == 5 && mc >= 5)) puts("10000");
        else if(mx > 3 || (mx == 3 && mc > 1)) puts("100000");
        else if(mx == 3 || (mx == 2 && mc >= 30)) puts("1000000");
        else puts("10000000");
        return 0;
    }
    
  • 相关阅读:
    shell脚本编程-结构化命令3-while、until命令
    shell脚本编程-结构化命令2-for命令
    sscanf解析复杂字符串,双引号通配符的使用问题
    shell脚本编程-结构化命令1-分支语句
    shell脚本编程基础
    linux系统管理的基本命令2
    linux系统管理的基本命令
    redis
    Eclipse启动报错
    java斗地主发牌源码
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/8016891.html
Copyright © 2020-2023  润新知