GMOJ 6824. 【2020.10.17提高组模拟】英雄联盟(lol)

 

 这是这套题中最水的一题,考场我的做法是用一个期望概率dp,计算出砍100000次刀之后的值,然后可以发现:

从10000增长到100000,从100000到1000000,增长的数每次是上一次的10^-1倍,然后就可以用等比数列求和做出来。

正解是设每砍i刀暴击一次的期望是s[i],则有s[i]=(1-x)*(1-2*x)*...*(1-(i-1)*x)*(k*x)*i;

那么最后的答案就是1/(sigma(s[i]))

 

 

#include<cstdio>
#include<algorithm>
#include<cstring>
#define db double
#define N 2000000
using namespace std;
int n,x,i,k;
db sum[N],ans;
int main(){
    freopen("lol.in","r",stdin);
    freopen("lol.out","w",stdout);
    scanf("%d",&x);
    k=100/x;
    if (100%x==0) k--;
    sum[0]=1;
    for (i=1;i<=k;i++)
        sum[i]=(db)sum[i-1]*(1-(db)x*i/100);
    ans=0;
    for (i=1;i<=k+1;i++)
        ans+=(db)sum[i-1]*((db)min(x*i,100)/100)*i;
    printf("%.10lf\n",1/ans);
    return 0;
}

 

posted @ 2020-10-17 16:43  Mohogany  阅读(153)  评论(0编辑  收藏  举报