题解:AT_abc224_g [ABC224G] Roll or Increment
ABC224G.Roll or Increment
更好的阅读体验
题意:
有一个
-
花费
A ,使当前数字加一; -
花费
B ,重掷。
询问最优策略下到达
解法:
由于操作 2 前的操作 1 是无效的,所以最优策略一定分为两部分:
- 一直进行操作 2 使当前数字距离
T 足够近(或在S\leq T 且距离足够近时不进行操作 2); - 一直进行操作 1 使当前数字到达
T 。
足够近的概念比较模糊,所以我们定义足够近为当前数字小于
观察到这个式子里只有
当
但是发现在
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define ld long double
ld n,s,t,a,b,ans;
inline ld cal(int k){
return 1.0*b*n/(k+1)+1.0*a*k/2.0;
}
int main(){
cin>>n>>s>>t>>a>>b;
ans=min(cal(0),cal(t-1));
if(s<=t)ans=min(ans,a*(t-s));
int mink=sqrtl(2.0*b*n/a)-1;
if(mink>=0 && mink<t)ans=min(ans,cal(mink));
if(mink-1>=0 && mink-1<t)ans=min(ans,cal(mink-1));
if(mink+1>=0 && mink+1<t)ans=min(ans,cal(mink+1));
printf("%.16Lf\n",ans);
return 0;
}