Bzoj2720--violet5列队春游
题意 :
题解 :
n^3的做法很好想,直接枚举小朋友,长度和位置暴力计算就可以了
然后我们可以发现计算位置不同长度相同的答案时有很多相同的计算
所以我们可以不去枚举位置,而对每个长度,所有位置在这个长度之前的概率均为0,因为即使前面全比他小长度也到不了我们当前的长度,而之后的位置概率都是相同的,这样就可以去掉位置了
设s为比我们枚举到的小朋友矮的人数,对于每个长度L的概率为s/(n-1)*(s-1)/(n-2)...*(s-L+1)/(n-L)
上述复杂度为n^2
网上看到有线性做法,没看懂,看懂再来更新
Upd : 线性做法如下
考虑每个人的视野范围的期望=$\sum (i * p(i))$ = $\sum (p(\ge i))$
然后排列推一推
具体可以参考http://www.cnblogs.com/yousiki/p/6399976.html
代码(n^2) :
#include<bits/stdc++.h> using namespace std; #define MAXN 305 int n,h[MAXN],ap[1005]; double ans; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&h[i]); sort(h+1,h+1+n); for(int i=1;i<=n;i++) if(!ap[h[i]]) ap[h[i]]=i; for(int i=1;i<=n;i++) { double p=1; for(int j=1;j<=n;j++) { ans+=p*(n-j+1)/n; if(j==n) break; p=p/(n-j)*(ap[h[i]]-j); } } printf("%.2lf\n",double(ans)); return 0; }