题意: 有一道分值为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 ",ans); } return 0; }