Rockethon 2015C

来源:互联网 发布:linux的解压缩命令 编辑:程序博客网 时间:2024/05/22 15:57

题意:给定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);}
0 0
原创粉丝点击