5094: 硬盘检测
Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 227 Solved: 56
[ Submit][ Status][ Discuss]
Description
很久很久以前,小Q买了一个大小为n单元的硬盘,并往里随机写入了n个32位无符号整数。因为时间过去太久,硬盘上的容量字眼早已模糊不清,小Q也早已忘记了硬盘的容量。小Q记得,n可以被表示成10^k(1<=k<=7)的形式,即十到一千万。他还记得自己曾经m次随机读取某个32位无符号整数的记录。小Q现在正在Quapler宇宙飞船上遨游WF18星座,所以他想请你帮他找出n的具体大小。
Input
第一行包含一个正整数m(m=10000),表示随机访问硬盘的次数。
接下来m行,每行一个整数a_i(0<=a_i<2^{32}),即每次随机访问读取的结果。
Output
输出一行一个整数,即n的大小。
Sample Input
5
1 2 3 4 5
Sample Output
10
设选出的m个数字有k个不同的,其中第i个数字出现si次,那么概率
题目就是让你找一个n使得p最大
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define LL long long
LL p[10005];
int sum[10005];
long double jc[10005];
int main(void)
{
long double mx, val;
int cnt, i, n, m, now, ans;
scanf("%d", &m);
for(i=1;i<=m;i++)
scanf("%lld", &p[i]);
sort(p+1, p+m+1);
cnt = 0, now = 1;
for(i=2;i<=m;i++)
{
if(p[i]!=p[i-1])
sum[++cnt] = now, now = 1;
else
now++;
}
sum[++cnt] = now;
for(i=1;i<=m;i++)
jc[i] = jc[i-1]+log(1.0*i);
mx = -1e10;
for(n=10;n<=10000000;n*=10)
{
if(n<cnt)
continue;
val = jc[m]-m*log(n*1.0);
for(i=1;i<=cnt;i++)
{
val += log(1.0*n-i+1);
val -= jc[sum[i]]-jc[i];
}
if(val>mx)
mx = val, ans = n;
}
printf("%d\n", ans);
return 0;
}