Description
很久很久以前,小Q买了一个大小为n单元的硬盘,并往里随机写入了n个32位无符号整数。因为时间过去太久,硬
盘上的容量字眼早已模糊不清,小Q也早已忘记了硬盘的容量。小Q记得,n可以被表示成10^k(1<=k<=7)的形式,即
十到一千万。他还记得自己曾经m次随机读取某个32位无符号整数的记录。小Q现在正在Quapler宇宙飞船上遨游WF1
8星座,所以他想请你帮他找出n的具体大小。
Input
第一行包含一个正整数m(m=10000),表示随机访问硬盘的次数。
接下来m行,每行一个整数a_i(0<=a_i<2^{32}),即每次随机访问读取的结果。
Output
输出一行一个整数,即n的大小。
Sample Input
15
2743802941
2520732963
3408553159
1132588462
2520732963
1252627160
2963673642
3972869548
2743802941
684663103
2743802941
3972869548
2520732963
1252627160
1252627160
Sample Output
10
题解
给一下官方题解的做法吧…
发现m是唯一的,可以对于每一个N,本机随机那么几百组数据求出不同的数个数的平均值
最后选最靠近那个就行了…
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<ctime>
#include<map>
#include<bitset>
#include<set>
#define LL long long
#define mp(x,y) make_pair(x,y)
#define pll pair<long long,long long>
#define pii pair<int,int>
using namespace std;
inline LL read()
{
LL f=1,x=0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int stack[20];
inline void write(LL x)
{
if(x<0){putchar('-');x=-x;}
if(!x){putchar('0');return;}
int top=0;
while(x)stack[++top]=x%10,x/=10;
while(top)putchar(stack[top--]+'0');
}
inline void pr1(int x){write(x);putchar(' ');}
inline void pr2(LL x){write(x);putchar('\n');}
double avg[10]={0,10.0000000000
,100.0000000000
,993.0100000000
,5448.1600000000
,9195.3300000000
,9910.8300000000
,9989.9800000000};
const int N[10]={0,10,100,1000,10000,100000,1000000,10000000};
int a[10005];
int main()
{
int m=read();
for(int i=1;i<=m;i++)a[i]=read();
sort(a+1,a+1+m);
m=unique(a+1,a+1+m)-(a+1);
double mx=9999999999;int p;
for(int i=1;i<=7;i++)
if(fabs(m-avg[i])<mx)mx=fabs(m-avg[i]),p=i;
pr2(N[p]);
return 0;
}