【bzoj5094】硬盘检测 乱搞

题目描述

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

输入

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

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

输出

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


题解

乱搞

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

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

时间复杂度 $O(m\log 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;
}

 

posted @ 2017-12-10 14:46  GXZlegend  阅读(295)  评论(0编辑  收藏  举报