湫湫系列故事——植树节

Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 935    Accepted Submission(s): 556


Problem Description
  今天是一年一度的植树节,腾讯幼儿园要求每个老师在班里选出几个小朋友一起去野外种植小树苗,根据学校的整体安排,湫湫老师的班里要选出3个小朋友。  已知湫湫的班里共有n个孩子,每个孩子有Bi个朋友(i从1到n),且朋友关系是相互的,如果a小朋友和b小朋友是朋友,那么b小朋友和a小朋友也一定是好朋友。为了选择的公平性,湫湫老师会随机抽取3个小朋友出来(每个人被抽到的概率相同),但是她很希望这3个小朋友之间的关系完全相同,湫湫老师想请你帮她算算抽到的3个小朋友正好关系相同的概率是多少?
  PS. 关系相同就是指要么3个人互相是好朋友,要么3个人互相都不是好朋友。
 


Input
输入数据第一行是一个整数T(1<=T<=1000),表示输入数据的组数;每组数据的第一行是一正整数n表示孩子的总数(2<n<=1000),第二行有n个数Bi (i从1到n),分别代表每个小朋友的朋友的个数。
 


Output
对于每组数据,请输出抽到的3个小朋友关系相同的概率,结果保留3位小数。
 


Sample Input
1 5 3 3 3 3 4
 


Sample Output
0.400

 

分析:

互相为朋友关系或者是彼此都没有朋友关系,也就是说三人之间有三条边或者是有零条边都是称为相同关系的。

第i个点 的朋友有 P[i] 个, 我们选择这样的策略来选出3个点: 第i个点为第1个点 ,然后 从p[i] 个点中任意选一个点 作为第二个点 , 然后从 剩下的 n-1-p[i]点中 作为第三个点。 共有1*p[i]*(n-1-p[i]) 种方法, 然后对所有的 i 的种类求和 ,就是  不同关系的种类。 但是,每种三点情况 策略重复了2次,故我们需要除2。 

 

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string>
 4 #include<string.h>
 5 #include<map>
 6 #include<math.h>
 7 
 8 using namespace std;
 9 
10 int main()
11 {
12     int t;
13     scanf("%d",&t);
14     while(t--)
15     {
16         int n,temp;
17         double ans=0.0,mu;
18         scanf("%d",&n);
19         for(int i=0;i<n;i++)
20         {
21             scanf("%d",&temp);
22             ans+=temp*(n-1-temp);
23         }
24         ans/=2.0;
25         mu=n*(n-1)*(n-2)/6;
26         ans=ans/(double)mu;
27         printf("%.3lf\n",1-ans);
28     }
29     return 0 ;
30 }