Rockethon 2015C

题意:给定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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值