英文不好,看不懂....
1x1+2/3+3/5+1/3x1/5+0x1/5+0.01可以看成为:3/3x5/5+2/3+3/5+1/3x1/5+0/3x1/5+0.01。
这样看起来更有规律,在两个分数乘积的中,一个分母是3,另外一个是5。先说为什么是5,从左边的图片可以看出在0-9范围的值最大,就是5。10-19中为3,而3又占5中的3/5。20-29中为1,1占5中的1/5,30-39为1,也占1/5。所以以为什么以5分母的分数就可以求出来了。再说3。。。3/3,2/3,1/3,0,/3正好分别对应0-9,10-19,20-29,30-39。3是由测试数据里面的最大数30除以图像的间距0-9这10个数等于3,因此确定了3是分母,分子再逐级递减。最后在最后的结果上面加上0.01,保留6位小数,就是最终的结果了。
#include"stdio.h"
#include"string.h"
int main()
{
int n,m;
int i;
int a[101];
int mark[101];
int s1,s2;
int max;
while(scanf("%d%d",&n,&m)!=-1,n||m)
{
memset(mark,0,sizeof(mark));
max=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
mark[a[i]/m]++;
if(max<a[i])max=a[i];//输入的数中最大的数
}
s2=max/m;//s2表示可以分的份数。。。
//s2++;
max=0;
for(i=0;i<=s2;i++)
{
if(mark[i]>max)//占份数最多。。
max=mark[i];
}
s1=max;
double ans;
ans=0.01;
for(i=0;i<=s2;i++)
{
ans+=(i*1.0/s2)*(mark[s2-i]*1.0/s1);
}
printf("%.6f\n",ans);
}
return 0;
}