gym/103049/problem G - Great Expectations(期望+二分)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gym/103049/problem G - Great Expectations(期望+二分)相关的知识,希望对你有一定的参考价值。

LINK

参考自这位博主

这个二分我是真想不到,令人窒息的操作…

定义 f [ i ] [ j ] f[i][j] f[i][j]表示从第 i i i关开始一直通关到最后,已经花了 j j j个罚时,还能打破记录的最小期望时间

首先加上第 i i i关成功了条件下的期望值,毫无疑问 f [ i ] [ j ] + = p i ∗ ( f [ i + 1 ] [ j ] + t i + 1 − t i ) f[i][j]+=p_i*(f[i+1][j]+t_{i+1}-t_i) f[i][j]+=pi(f[i+1][j]+ti+1ti)即可

如果第 i i i关失败

那么当 j + d i < = r − n − 1 j+d_i<=r-n-1 j+di<=rn1时,既可以重新开始,也可以硬着吃下 d i d_i di的罚时

f [ i ] [ j ] + = ( 1 − p i ) ∗ min ⁡ ( d i + t i + 1 − t i + f [ i + 1 ] [ j + d i ] , f [ 0 ] [ 0 ] ) f[i][j]+=(1-p_i)*\\min(d_i+t_{i+1}-t_i+f[i+1][j+d_i],f[0][0]) f[i][j]+=(1pi)min(di+ti+1ti+f[i+1][j+di],f[0][0])

否则,如果硬吃罚时无法破纪录,只能重开

f [ i ] [ j ] + = ( 1 − p i ) ∗ f [ 0 ] [ 0 ] f[i][j]+=(1-p_i)*f[0][0] f[i][j]+=(1pi)f[0][0]

然后 f [ 0 ] [ 0 ] f[0][0] f[0][0]你不知道…

令人窒息的操作出现了,我们可以二分 f [ 0 ] [ 0 ] f[0][0] f[0][0],设二分值为 m i d mid mid

m i d mid mid带进去求出算出来的 f [ 0 ] [ 0 ] f[0][0] f[0][0]

m i d < f [ 0 ] [ 0 ] mid<f[0][0] mid<f[0][0],说明 m i d mid mid需要变小,否则, m i d mid mid需要变大

为什么能二分我也不知道

#include <bits/stdc++.h>
using namespace std;
#define double long double
const int maxn = 5009;
const double eps = 1e-8;
int n,r,m,d[maxn],t[maxn];
double p[maxn],f[109][maxn];
//f[i][j]表示[i,m]已经用了j的惩时,破纪录还需要的时间 
double isok(double x)
{
	for(int i=0;i<=m;i++)
	for(int j=0;j<=r-n-1;j++)
		f[i][j] = 0;
	for(int i=m-1;i>=0;i--)
	for(int j=0;j<=r-n-1;j++)
	{
		f[i][j] = p[i]*( f[i+1][j]+t[i+1]-t[i] );//成功 
		if( j+d[i]<=r-n-1 )//重开或者吃惩时
			f[i][j] += (1.0-p[i] )*min( x,f[i+1][j+d[i]]+d[i]+t[i+1]-t[i] );
		else//只能重开 
			f[i][j] += ( 1.0-p[i] )*x;			 
	}
	return f[0][0];
}
int main()
{
	cin >> n >> r >> m;
	for(int i=1;i<=m;i++)	cin >> t[i] >> p[i] >> d[i];
	++m; t[m] = n, p[m] = 1.0, d[m] = 0;
	t[0] = 0, p[0] = 1.0, d[0] = 0;
	double l = 0, r = 1e17 , ans = 0;
	while( fabs(r-l)>=eps )
	{
		double mid = ( l+r )/2.0;
		if( isok(mid)>=mid )	l = mid+eps;//mid比较小 
		else	r = mid-eps, ans = mid;//mid比较大 
	}
	printf("%.9Lf",ans );
}

以上是关于gym/103049/problem G - Great Expectations(期望+二分)的主要内容,如果未能解决你的问题,请参考以下文章

如何在redhat6.5下安装oracle11gr2

如何实现SQLServer2008R2连接Oracle11gR2

如何在CentOS6.5系统上安装Oracle11gR2数据库

oracle11gR1系统配置要求

oracle11gR2中文全部显示为问号怎么解决

oracle 11g 安装包解压的问题