您的位置:首页 > 其它

Gym - 101257G 24【二分+看题】

2017-02-25 18:36 316 查看
题目链接:https://vjudge.net/problem/Gym-101257G

题意:有一道分值为sa的题,n个人一起写这道题,给出每个人的当前分数,和每个人写不出(一定要注意,比赛就是因为漏看了这里,WA好多次)这道题的概率,,让你输出有反超现象出现的期望

解析:每个人的当前分数是按降序排列的,所以排最后的开始往前看,数值在(a[n-1]-1到a[n-2]+sa)这个区间的都是会有反超情况发生的,所以可以先前缀和处理概率,然后再用二分查找来获取需要乘的区间位置就好

#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;
ans+=(sum[r]-sum[l])*(1.0-p[i]);
}
printf("%.9f\n",ans);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: