zoukankan      html  css  js  c++  java
  • 【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;
    }
    
  • 相关阅读:
    移位乘除法
    标准C++的一些约定
    图论的一些定义
    二进制取数在多重背包和母函数中的应用
    深入理解最小割的意义
    pku 3020 最小路径覆盖集
    pku 1986 LCA算法的应用
    pku 1185
    连通分量(tarjan算法)
    pku 2983 差分约束系统判断
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/8016891.html
Copyright © 2011-2022 走看看