HDU 4503 湫湫系列故事——植树节

来源:互联网 发布:java json解析 乱码 编辑:程序博客网 时间:2024/04/28 00:18

     题目大意:有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;}