仔细观察可以看为:3/3*5/5+2/3*3/5+1/3*1/5+0/3*1/5+0.01

又题目的最后一组测试数据是:

10 10

1
2
3
4
5
16
17
18
29
30

 

这可以得出什么结论呢?

1)首先看33是怎么来的?看测试数据中最大的测试数据为30,而它的w值为10,所以3是由最大的测试数据与w相除得到的,即3 = 30/10;然后3/3, 2/3, 1/3, 0/3逐级递减。

2)观察可得5/5,3/5,1/5,1/5。我们来看,5怎么得到的呢?在直方图中出现最多的那个数就是5.5,3,1,1则是各自在直方图中出现的频率。

 

由此可得结果,最后保留6位小数。 

CODE:

#include <stdio.h>
#include <string.h>        
#include <stdlib.h>
using namespace std;

const int SIZE = 1001;

int value[SIZE];
int hash[SIZE];          //hash
int n, w;

void init()
{
    memset(value, 0sizeof(value));
    memset(hash, 0sizeof(hash));
}

int cmp(const void *a, const void *b)
{
    return *(int*)a - *(int*)b;
}


int main()
{
    int i, j;
    double s;
    while(~scanf("%d%d",&n, &w), n, w)
    {
        s = 0.01;
        init();
        for(i = 0; i < n; i++)
        {
            scanf("%d", &value[i]);
        }
        qsort(value, n, sizeof(int), cmp);
        int max = value[n-1]/w;
        for(i = 0; i < n; i++)
        {
            int k = value[i]/w;
            hash[k]++;
        }
        int div = -1;
        for(i = 0; i <= max; i++)
        {
            if(hash[i] > div)
            {
                div = hash[i];
            }
        }
        for(i = max;i >= 0; i--)
        {
            s += 1.0*i/max*hash[max-i]/div;
        }
        printf("%.6lf\n", s);
    }
    return 0;

} 

 

posted on 2012-08-22 21:15  有间博客  阅读(206)  评论(0编辑  收藏  举报