hdu 4503(湫湫系列故事——植树节)

题解:

       这题不太好想,参考了下别人的思想,加自己的详细补充:
      1. 从反面想,若能求出3个人之间有一条关系或者两条关系的总数,问题便可解(余下就是三人两两相互关系和两两无关系)。
      2.对于点i,剩下的n-1个点可分为两个集合,一个是和i有关系的a[i],一个是没有关系的(n-1-a[i]),
      从这俩集合里分别取一个点,组成三个点,便符合了三个人之间有一条关系或者两条关系的条件。res=Σ(a[i] * (n-1-a[i])),
      3.在求和后的res中,
         你会发现三人有一条关系的情况下,有关系的两人被算了两次。
                          有两条关系的情况下,无关系的两人被算了两次。
        (自己作个简单图帮助理解)因为刚好的数了两次,所以结果要除2
#include<stdio.h>
int main()
{
    int T;
    int n;
    int a;
    double res;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        res=0.0;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a);
            res+=(n-a-1)*a;
        }
        printf("%.3lf\n",1.0-res*3/n/(n-1)/(n-2));//运算后的式子
    }
    return 0;
}

 

---恢复内容结束---

你可能感兴趣的:(HDU)