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; }
---恢复内容结束---