题意:给定n个区间(n<=5)[l,r],从没个区间任选一个数,问第二大的数的期望是多少
思路:此题主要是避免重复计算
从[1,104]枚举第二高价,EXP=$$\sum_{i=1}^{10^4} Pi*i,用此公式求得期望。
Pi=EachiTotal,Eachi表示每一个第二高价的情况数
Total=∏Ni=1(Ri−Li+1),Total表示总情况数
期望还可表示为:EXP=∑104i=1EachiTotal=Each1+Each2+…+Each104Total
不难发现,若当前第二高价为i,则必然有一个公司的标价为i,必然还有一个公司的标价>=i,而其余公司标价<=i。
用上述思想去求Eachi,难点在于要精确地保证不重复计算 。我的方法是两步:1. 枚举每一个标价>i的公司,再状压枚举其余公司的标价为i或者
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int l[6],r[6];
int main()
{
int i,j,k,t,n,judge;
double sum,tmp;
scanf("%d",&n);
for (i=1; i<=n; i++) scanf("%d%d",&l[i],&r[i]);
sum=0.0;
for (i=1; i<=10000; i++)
{
for (j=1; j<=n; j++) //max
for (k=1; k<=n; k++) //second
{
judge=1;
if (j==k) judge=0;
if (r[j]<i) judge=0;
if (r[k]<i||l[k]>i) judge=0;
for (t=1; t<=n; t++)
if (t!=j&&t!=k&&l[t]>i) judge=0;
if (judge==0) continue;
if (l[j]<=i)
{
if (k<j) tmp=1.0*(r[j]-i+1)/(r[j]-l[j]+1);
else tmp=1.0*(r[j]-i)/(r[j]-l[j]+1);
}
else tmp=1.0;
tmp=tmp/(r[k]-l[k]+1);
for (t=1; t<=n; t++)
if (t!=j&&t!=k&&r[t]>=i)
{
if (t<k) tmp=tmp*(i-l[t]+1)/(r[t]-l[t]+1);
else tmp=tmp*(i-l[t])/(r[t]-l[t]+1);
}
sum=sum+i*tmp;
}
}
printf("%.15lf\n",sum);
}