先講一講我眼中在期望
期望就是對於所有的情況 概率*權值的總和
一般對於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;
}
}