Gym 101257G 24 (概率+二分)

题意: 有一道分值为sa的题,n个人比赛写这道题,按照递减的顺序给出每个人的当前分数,和每个人写不出这道题的概率,让你输出有反超现象出现的期望 

思路:由于之前把题目翻译错了导致很久没有相通,后来看了别人的博客和代码才理解了这道题 http://blog.csdn.net/richie_ll/article/details/57088108

         首先我们先看一下什么是数学期望:试验中每次结果可能的概率乘以其结果的总和,再回过头来看这道题,让你求出有反超现象出现的期望,其实也是在求反超现象出现的概率(可以认为是二项分布),那什么时候会出现反超现象呢?假设我的现在的分数是num,我作对一题可以得10分,那么在我前面的[num,num+10)这个范围内的对手不做出来题我就能反超,其他对手爱咋地咋地,反正也赢不了他,那么这个范围我们应该怎么去找能,答案是二分!用c++里自带的迭代器我们就快速找到!

代码:

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>

using namespace std;

int data[100005];
double p[100005];
double sum[100005];

bool cmp(int a,int b)
{
    if(a>b) return true;
    else return false;
}

int main()
{
    int n,num;
    double ans;
    while(cin>>n>>num)
    {
        for(int i=0;i<n;i++)
        scanf("%d",&data[i]);
        for(int i=0;i<n;i++)
        scanf("%lf",&p[i]);
        sum[1]=p[0];
        for(int i=1;i<n;i++)
        sum[i+1]=sum[i]+p[i];
        ans=0;
        for(int i=0;i<n;i++)
        {
            int l=upper_bound(data,data+n,data[i]+num,cmp)-data;
            int r=lower_bound(data,data+n,data[i],cmp)-data;
            ans+=(sum[r]-sum[l])*(1.0-p[i]);
        }
        printf("%.9lf\n",ans);
    }
    return 0;
}

 

posted @ 2017-03-18 21:14  simpleknight  阅读(217)  评论(0编辑  收藏  举报