题解:P10616 [ICPC2013 WF] Hey, Better Bettor
donghanwen1225 · · 题解
高考结束了,来复健 OI。
首先考虑赌博的策略。容易发现我们的策略就是当我们赚到 or 亏到一定钱数时,选择继续拼还是及时止损。
因此,设及时收手的边界为
我们需要分析
接下来建立递推关系。若当前位于位置
对以上这个方程组,我们发现在边界上有
于是有
记
现在,我们的目标就是通过调整
一些可能的细节:
-
-
由于题中的
x,p 均最多有小数点后2 位,最极限的情况就是99.99\;49.99 。据此,可以预先找到l,r 的上界。实测2.5\times10^4 即可。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
double x,p,u,pw[50005];
double v(int l,int r)
{
double n1=pw[r],n2=pw[l+r];
return (n1-n2)/(1-n2)*r-(1-x)*(1-n1)/(1-n2)*l;
}
double cal(int rr)
{
double ans=0;int l=1,r=25000;
while(r-l>=4)
{
int m1=l+(r-l)/3,m2=r-(r-l)/3;
double r1=v(m1,rr),r2=v(m2,rr);
if(r1>r2) r=m2;
else l=m1;
}
for(int i=l;i<=r;i++) ans=max(ans,v(i,rr));
return ans;
}
int main()
{
scanf("%lf%lf",&x,&p);
x/=100;p/=100;u=p/(1-p);
pw[0]=1;for(int i=1;i<=50000;i++) pw[i]=pw[i-1]*u;
double ans=0;
for(int i=1;i<=25000;i++) ans=max(ans,cal(i));
printf("%.12lf\n",ans);
return 0;
}