先讲一讲我眼中在期望
期望就是对于所有的情况 概率*权值的总和
一般对于d[i]为处理到此时的期望
由第I步 到第j步 Change概率为p
到d[j]=(d[i]+change[i])*p+d[i]*(1-p)
因此 d[j]=d[i]*change[i]*p;
也就是说 期望只要从上一状态转移即可
这大概就是期望的特性吧
就是当前情况已经是乘上概率的情况,所以对于下一步的情况,只要乘当前情况到下一步概率即可。
其实这三题我写过很详细的题解,被删啦,下次还是先存一下吧
BZOJ3450 戳一戳
代码:
#include<bits/stdc++.h>
using namespace std;
long long n;
double r[200000],d1[200000],d2[200000],sum[200000];
int main()
{
cin>>n;
for (int i=1;i<=n;i++)
cin>>r[i];
for (int i=1;i<=n;i++)
{
sum[i]=sum[i-1]+r[i]*(1+3*d1[i-1]+3*d2[i-1]);
d1[i]=(d1[i-1]+1)*r[i];
d2[i]=(d2[i-1]+d1[i-1]*2+1)*r[i];
//cout<<sum[i]<<endl;
}
printf("%.1lf",sum[n]);
}
[六省联考2017]分手是祝愿 题解
补充一下:
•考虑从大到小按,显然如果当前这盏是亮的就按。
•可以证明这是最优的一种方法,并且初始状态与最优解的按下的灯的集合一一对应。
#include <bits/stdc++.h>/调半天是因为预处理没考虑清楚!t*t特判 但t*t<i的时候有可能是因数!!/
using namespace std;
const long long mod=100003;
long long n,sum,k,ans,zhi,a[1000000],t,f[1000000];
long long pm(long long x,long long y)
{
long long t=1;
for (;y;x=(x*x)%mod,y=y/2) if (y%2==1) t=(t*x)%mod;
return t;
}
int main()
{
cin>>n>>k;
ans=1;sum=0;
for (int i=1;i<=n;i++)
ans=(ans*i)%mod;
for (int i=1;i<=n;i++) { cin>>a[i];}
for (int i=n;i>=1;i--) if (a[i]){ zhi++;
t=sqrt(i); if (t*t==i) a[t]=1-a[t];
for (int j=1;(t*t==i)?j<t:j<=t;j++)
if (i%j==0) { a[j]=1-a[j]; a[i/j]=1-a[i/j];}
}
if (zhi<=k) cout<<zhi*ans%mod<<endl;
else {f[n]=1;
if (n==zhi) sum++;
for (long long j=n-1;j>=k+1;j--)
{
f[j]=((f[j+1])*(n-j)+n)%mod*pm(j,mod-2)%mod;
if (j<=zhi) sum=(sum+f[j])%mod;
}
sum=(sum+k)*ans%mod;
cout<<sum<<endl;
}
}