2013腾讯编程马拉松初赛第〇场(HDU 4503) 湫湫系列故事——植树节

58 篇文章 0 订阅

http://acm.hdu.edu.cn/showproblem.php?pid=4503

题目:

已知湫湫的班里共有n个孩子,每个孩子有Bi个朋友(i从1到n),且朋友关系是相互的,如果a小朋友和b小朋友是朋友,那么b小朋友和a小朋友也一定是好朋友。为了选择的公平性,湫湫老师会随机抽取3个小朋友出来(每个人被抽到的概率相同),但是她很希望这3个小朋友之间的关系完全相同,湫湫老师想请你帮她算算抽到的3个小朋友正好关系相同的概率是多少?PS. 关系相同就是指要么3个人互相是好朋友,要么3个人互相都不是好朋友。

思路:

概率论下学期教。。

看了别人的思路的。

从N个人选3个人有C(N,3)种方法,这是总事件数,也就是n*( n-1)*(n -2)/6

接下来,因为有3个人之间要么都是好朋友,要么都不是好朋友,要么有两个是好朋友。

SO,答案是1-两个是好朋友的概率。

两个是好朋友的概率怎么求呢?

对于孩子i,他有num[i]个好友,挑出3个人一个是i,则两个是好朋友的事件个数显然是num[i]*(n-num[i]-1)  (要扣除他自己,n是总数)

这样,把每个孩子的事件个数加起来除以2,就得到了两个为好友的事件数。

为什么除以2?x是y的好朋友,x算的时候y算了一次,y的时候x又算了一次,也就是说重复了~所以/2.

嗯然后除以总数就可以得到n个条选出3个人两个有关系的概率~答案就是1-这个数啦~


#include <cstdio>
const int MAXN=1024;
int num [MAXN];
int main ()
{
	int T ;
	scanf("%d" ,&T);
	while(T --)
	{
		int n ;
		scanf("%d" ,&n);
		for(int i=0; i<n ;i++)
			scanf("%d" ,&num[ i]);
		int tot =n*( n-1)*(n -2)/6;//组合数 C(N,3)
		int k =0;
		for(int i=0; i<n ;i++)
		{
			k+=num [i]*( n-1-num [i]);
		}
		k>>=1;
		printf("%.3lf\n" ,1.0-(1.0*k)/ tot);
	}
	return 0;
}



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值