Tyvj1952 Easy OSU

本文介绍了一种使用概率和期望计算技巧解决特定问题的方法。通过计算每一位对最终答案的贡献,利用期望的可加性原理,文章详细展示了如何根据不同字符('o', 'x', '?')更新连续1的最大长度及其对答案的贡献,并提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EASY

对于每一位分别计算对答案的贡献,因为期望具有可加性,所以E[i]相加就是最后答案

l记录到当前位最大连续1的长度

s[i]=='o',第i位对答案的贡献= (l+1)^2-l^2=2*l+1;l=l+1;

s[i]=='x' 第i位对答案的贡献=0 ,l=0

s[i]=='?' 0.5的概率为1,贡献2*l+1;

             0.5的概率为0,贡献0

             l=0.5*(l+1)+0.5*0

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 100005
using namespace std;
int n;
double t,l[N],l2[N];
int main()
{
    double ans=0.0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
         scanf("%lf",&t);
         ans+=t*((double)3.0*l2[i-1]+(double)3.0*l[i-1]+(double)1.0);
         l[i]=(l[i-1]+1)*t;
         l2[i]=(l2[i-1]+2.0*l[i-1]+1)*t;
    }
    printf("%0.1lf",ans);
  //  while(1);
    return 0;
}

OSU

方法和上面差不多,只是特别注意平方的期望和期望的平方不同,所以开两个数组,f[i]表示前i位长度的期望,g[i]表示前i位长度的平方的期望

对于每一位的贡献=(l+1)^3-l^3=3*l^2+3*l+1=3*g[i]+3*f[i]+1

f[i]很好求,按照上面的方法分类讨论直接求

此时,前i-1位的长度为f[i-1],如果下一位为1,则

g[i]=pi*g[i-1]=pi*E[(f[i-1]+1)^2]=pi*E[f[i-1]^2+2*f[i-1]+1]=E(f[i-1]^2)+2*E(f[i-1])+1(E表示期望)

所以g[i]=g[i+1]+2*f[i-1]+1;

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 100005
using namespace std;
int n;
double t,l[N],l2[N];
int main()
{
    double ans=0.0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
         scanf("%lf",&t);
         ans+=t*((double)3.0*l2[i-1]+(double)3.0*l[i-1]+(double)1.0);
         l[i]=(l[i-1]+1)*t;
         l2[i]=(l2[i-1]+2.0*l[i-1]+1)*t;
    }
    printf("%0.1lf",ans);
  //  while(1);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值