CS 300
题意:起点为0 终点为D.有一个长度为L的火车,初始火车头在起点0.
有n+2个加油站,起点和终点也是加油站.第i个加油站在点x[i].
火车的任意一个部位在加油站时 都可以加油,如果火车没有油了,则火车会被推到离它最近的加油站上.
现在把火车头 随机仍到了[0,D]的某个位置上,问火车被推的距离期望是多少? n<=1e5,D<=1e9.
先将加油站坐标从小到大排序.
当火车头落在x:[p[i],p[i+1]]之间
若p[i+1]-p[i]<=L 则火车有部分若在加油站上.
否则当x=[p[i]+L,(p[i]+L+p[i+1])/2]时 火车往左推 推的距离为[0,(p[i+1]-p[i]-L)/2]
当x=[(p[i]+L+p[i+1])/2,p[i+1]]时 火车向右推, 推的距离为[(p[i+1]-p[i]-L)/2,0]
题意:起点为0 终点为D.有一个长度为L的火车,初始火车头在起点0.
有n+2个加油站,起点和终点也是加油站.第i个加油站在点x[i].
火车的任意一个部位在加油站时 都可以加油,如果火车没有油了,则火车会被推到离它最近的加油站上.
现在把火车头 随机仍到了[0,D]的某个位置上,问火车被推的距离期望是多少? n<=1e5,D<=1e9.
先将加油站坐标从小到大排序.
当火车头落在x:[p[i],p[i+1]]之间
若p[i+1]-p[i]<=L 则火车有部分若在加油站上.
否则当x=[p[i]+L,(p[i]+L+p[i+1])/2]时 火车往左推 推的距离为[0,(p[i+1]-p[i]-L)/2]
当x=[(p[i]+L+p[i+1])/2,p[i+1]]时 火车向右推, 推的距离为[(p[i+1]-p[i]-L)/2,0]
此时连续形期望积分计算的是一个等腰三角形的面积S=1/4*(p[i+1]-p[i]-L)^2 最后在除以D(???)
#include <bits/stdc++.h>
using namespace std;
typedef long double db;
const int N=2e5+5;
int p[N],D,L;
int n;
int main()
{
cin>>D>>L>>n;
for(int i=1;i<=n;i++)
cin>>p[i];
p[++n]=0;
p[++n]=D;
sort(p+1,p+1+n);
db ans=0;
for(int i=2;i<=n;i++)
{
long long t=(p[i]-p[i-1]-L);
if(t>0)
ans+=t*t;
}
ans/=4;
ans/=D;
printf("%.10Lf\n",ans);
return 0;
}