原題
題目大意
給定
解題思路
設
設
顯然
先看看
只要求
其實
誤差分析
所以大概
參考代碼
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define maxn 105
#define lim 300000
#define ld long double
#define mem(a,b) memset(a,b,sizeof(a))
#define eps 1e-15
using namespace std;
ld f[2][maxn];
ld g[2],ans;
ld p[maxn];
int n;
int main(){
scanf("%d",&n);
fo(i,1,n) {
cin>>p[i];
p[i]/=100;
}
int last=0,now=1;
fo(i,1,lim) {
last^=1;
now^=1;
ld best=0;
int w=0;
fo(j,1,n) {
ld thi=(1-f[last][j])*p[j]/f[last][j];
if (thi>best) {
best=thi;
w=j;
}
}
fo(j,1,n) {
if (j==w) {
f[now][j]=f[last][j]+(1-f[last][j])*p[j];
}
else {
f[now][j]=f[last][j];
}
}
if (f[last][w]<eps) {
g[now]=1;
fo(j,1,n) g[now]=g[now]*f[now][j];
}
else g[now]=g[last]*f[now][w]/f[last][w];
ans=ans+(g[now]-g[last])*i;
}
double pri=ans;
printf("%.16lf",pri);
return 0;
}