【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; }