hdu 4153(数学)

点击打开链接


英文不好,看不懂....


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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值