1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
#include<bits/stdc++.h>
#define fs first
#define sc second
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
constexpr double eps=1e-10;
double dp[205][205][205];
bool v[205][205][205];
int n,l;
double dfs(int pr,int sg,int lf){
if(v[pr][sg][lf])return dp[pr][sg][lf];
if(pr==0||lf==0)return 0.0;
double prf=(double)pr,sgf=(double)sg;
// 开到了一张已有的,直接爽飞
double ans=0;
if(sg>=1)ans=sgf/(prf*2.0-sgf)*(1.0+dfs(pr-1,sg-1,lf));
// 开到了一张新的
double pnew=2.0*(prf-sgf)/(2*prf-sgf);
if(pnew>0){
double res=0;
// 在剩下的牌里抽到了配对的
if(2.0*prf-sgf-1.0>=eps&&pr>=1)res+=1.0/(2.0*prf-sgf-1.0)*(1.0+dfs(pr-1,sg,lf));
// 抽到了已有的一张
if(lf>1){
if(sg!=0&&2.0*prf-sgf-1.0>=eps)res+=sgf/(2.0*prf-sgf-1.0)*(1.0+dfs(pr-1,sg,lf-1));
}
// 抽到了全新的
if(lf>1){
if(prf-sgf-1.0>=eps&&(2.0*prf-sgf-1.0>=eps))res+=2.0*(prf-sgf-1.0)/(2.0*prf-sgf-1.0)*dfs(pr,sg+2,lf-1);
}
ans+=res*pnew;
}
v[pr][sg][lf]=1;
return dp[pr][sg][lf]=ans;
}
int main(){
scanf("%d%d",&n,&l);
int sum=0;
for(int i=1;i<=n;i++){
int t;
scanf("%d",&t);
sum+=t;
}
printf("%.10lf",(double)sum/(double)n*dfs(n,0,l));
}
/*
i,j,k 表示还有 i 对没开出来,开出来了 j 个单张,生命值为 k
*/
|