当前位置: 代码迷 >> 综合 >> HDU 5753 Permutation Bo (概率与期望)
  详细解决方案

HDU 5753 Permutation Bo (概率与期望)

热度:69   发布时间:2023-11-15 13:40:56.0

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5753

#include<bits/stdc++.h>
using namespace std;#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root l,r,rt
#define mst(a,b) memset((a),(b),sizeof(a))#define pii pair<ll,ll>
#define mk(x,y) make_pair(x,y)
#define fi first
#define se secondconst int  maxn =1e3+5;
const int mod=7;
const int ub=1e6;
ll powmod(ll x,ll y){ll t; for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod; return t;}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
/*
概率题,不难发现要特判两端(如果只有一个数特判下)
对于两端,其对整体的贡献是,该位置贡献的概率,
不难推出是sigma (i-1)/(n*(n-1)(n-2)) i=2~n,
得出两端的概率是0.5,
用类似的方法,可以得到去两端外中间的数字贡献的概率是1/3.
sigma (i-1)(i-2)/((n)*(n-1)*(n-2)),i=1~n。
这一答案就简单了。
*/int n,a[maxn];
int main()
{while(scanf("%d",&n)!=EOF){rep(i,1,n+1) scanf("%d",&a[i]);int tmp=a[1]+a[n];rep(i,1,n+1) a[i]+=a[i-1];///求前缀和if(n==1) printf("%.6f\n",1.0*a[1]);else printf("%.6f\n",1.0*tmp/2.0+1.0*(a[n]-tmp)/3.0);}return 0;
}

 

  相关解决方案