题目大意:有n个小孩,给出他们每个人认识的人的数目,且已知:a与b认识,那么b就与a认识,求解任选三个人他们之间的关系是相同的概率?
(即要么三个互不相识,要么三个都相互认识)
考虑相反的情况:选出的三个小孩中有两人认识
或者一个人认识其余两人,建图模型后即排除有1边和2边情况
随机选三人sum = C(n,3),不满足的情况种类:
小孩i认识data[i]人,不认识的人数(n-data[i]-1);
那么选出不满足情况(i小孩认识1人认识,不认识1人)的种类数就是:data[i]*(n-data[i]-1);
但是这样被求算重复过一次,所以总数要除以2
这样就可以得到概率(sum-data[i]*(n-1-data[i]))/sum
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
int Tcas;
scanf("%d",&Tcas);
while(Tcas--)
{
int n;
scanf("%d",&n);
int data,ans = 0;
for(int i=0;i<n;i++)
{
scanf("%d",&data);
ans += data*(n-data-1);
}
//所有的种类,组合数C(n,3)
int sum = n*(n-1)*(n-2)/6;
ans = sum - ans / 2;
printf("%.3lf\n",(double)ans/sum);
}
system("pause");
return 0;
}