欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

幻象 phantom.cpp

程序员文章站 2022-04-01 14:47:49
...

【一句话题意】有n个长度为一的线段,每个点出现的概率为Ai%。一段线段对答案的贡献为它的长度的平方。求答案的期望值。n<=1e6.
【分析】由于只要求保留一位小数,所以卡精度可以乱搞搞过。
这里有一份乱搞搞过的代码
正解是再加一个辅助数组g表示到i的期望长度。然后就会有两组我不会推的方程。
L[i] = (L[i-1] + 1)*a[i]%。
设f[i]表示前i秒的答案f[i] = f[i-1] + ((L[i-1] + 1)2 – L[i-1]2)a[i]%
【code】

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e6+1000;
int n,a[maxn];
double ans=0,b[maxn];
void read(int &x){
	x=0;char tmp=getchar();
	while(tmp<'0'||tmp>'9') tmp=getchar();
	while(tmp>='0'&&tmp<='9') x=(x<<1)+(x<<3)+tmp-'0',tmp=getchar();
}
inline double calc(int x){
	int len=0,i=1;double p=1,ret=0;
	for(int i=1;i<=n;i++){
		if(x&1)	len++,p=p*b[i];
		else ret=ret+len*len,len=0,p=p*(1-b[i]);
		x=x>>1;
	}
	ret=ret+len*len;
	return ret*p;
}
int main(){
	freopen("phantom.in","r",stdin);
	freopen("phantom.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)
		read(a[i]),b[i]=a[i]/100.0;
	for(int i=0;i<(1<<n);i++)
		ans+=calc(i);
	printf("%.1lf",ans);
	return 0;
}
相关标签: 题解

上一篇: beautiful.cpp

下一篇: Perfect