Gym

来源:互联网 发布:kf5雾化器做芯数据 编辑:程序博客网 时间:2024/06/05 20:26

输入有人数 和一道题的分数
在输入每个人的当前分数和 他做不对这道题的概率
问有实现反超的概率(每个人的反超概率相加)
因为考虑到加法原理,所以这种概率是可以累加的,
还有一种情况就是,如果分数是10分,一个人15,一个人2分,那么即使那个人作对了题 12<15仍然无法实现反超。
思路,二分,求出 a[i]—a[i]+sa(题目分数)这其中的概率相加(都是做不对的概率哦),然后再乘以 本a[i]哥能作对这道题的概率。

#include <algorithm>#include <cstdio>#include <cstring>#include <iostream>#include <queue>using namespace std;const int maxn = 2*1e5+100;int a[maxn];double p[maxn];double sum[maxn];bool cmp(const int &A,const int &B){    return A>B;//½µÐò}int main(void){    int n,sa;    memset(sum,0,sizeof(sum));    scanf("%d %d",&n,&sa);    for(int i=0;i<n;i++)        scanf("%d",&a[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];    double ans = 0;    for(int i=0;i<n;i++)    {        int l=upper_bound(a,a+i+1,a[i]+sa,cmp)-a;        int r=lower_bound(a,a+i+1,a[i],cmp)-a;        //由对upper的理解可以知道,这里返回的是第一个小于等于a[i]de;        //因为是降序,所以一定是a[i];        //但是如果好几个数都一样就错了。        //int r=i;        ans+=(sum[r]-sum[l])*(1.0-p[i]);    }    printf("%.9f\n",ans);    return 0;}
0 0
原创粉丝点击