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位小數,就是最終的結果了。
[cpp]
#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;
}