题目描述
Takuru 是一名情报强者,所以他想利用他强大的情报搜集能力来当中间商赚差价。
Takuru 的计划是让 Hinae 帮他去市场上买一个商品,然后再以另一个价格卖掉它。Takuru 会给 Hinae 一定的钱 pp。(pp 是一个非负的实数)
这个商品的市场价是一个在 [l, r][l,r] 内均匀随机的实数。
如果 p \geqslantp⩾ 市场价,那么 Hinae 会买下这个商品,然后私吞剩下的钱。也就是说,Takuru 以 pp 的代价买来了这个商品。
如果 p <p< 市场价,那么 Hinae 既不会买下商品,又不会私吞任何钱。也就是说,Takuru 的利润为 00。
当 Hinae 买下了商品后,Takuru 会生成一个在 [L, R][L,R] 内均匀随机的实数 qq,并把商品以 qq 的价格卖掉。那么 Takuru 的利润就是 q - pq−p。
Takuru 想要获得最多的利润,所以你要帮 Takuru 确定给 Hiane 的钱 pp,使得 Takuru 的期望利润最大。请求出最大的期望利润。
输入描述
第一行两个正整数 ll 和 rr (1\leqslant l < r \leqslant 20001⩽l<r⩽2000)。
第二行两个正整数 LL 和 RR (1\leqslant L < R \leqslant 20001⩽L<R⩽2000)。
输出描述
一个实数,表示最大的期望利润。(四舍五入后保留 44 位小数,输出超过 44 位或少于 44位都会获得 Wrong Answer。)
如果答案为 00,请不要输出多余的负号。
若答案为 vv,保证 v+10^{-6}v+10−6 以及 max(v-10^{-6},0)max(v−10−6,0) 四舍五入后保留 44 位小数的结果不会改变。
样例输入 1
400 1200
600 1800
样例输出 1
200.0000
样例输入 2
1999 2000
1 2
样例输出 2
0.0000
思路:
因为主人公的售价是 L~R 所以 主人公售价的期望是 (L+R)/2
我们给买手的钱是p,那么我们主人公的利润就是 ((L+R)/2-p)
我们知道 期望=值*概率
利润期望=利润值*概率
我们来看下概率,
P必须取到 l和r之间,因为如果p大于r,那么不是最优的选择,因为可以选择r可以产生更好的利益。
而p小于l的话,买手会无法购物商品,所以也不可以。
那么p就在 l和r之间了,
买手能买商品的时候当且仅当 商品的市场价 恰好小于等于p,也就是市场价y小于p时,可以购买,
那么y的范围时 l~p,总范围是l~r,所以概率是 (p-l)/(r-l)
期望就是
((L+R)/2-p)*(p-l)/(r-l)
公式就是一个关于p的二次函数,并且a是小于等于0的,有极大值,我们判定对称轴是否在l到r之间,
如果在,那么函数的极值就是答案,如果不在,那么取区间的左右极限的较大值是答案。
注意处理以下0*负数=-0的情况,
细节见code
#include
#include
#include
#include
#include
#include
#include
#include
gbtb;
cin>>l>>r;
cin>>L>>R;
double t=(L+R)/2.00;
double k=(r-l);
double a=-1.00/k;
double b=(t+l)/k;
double c=-l\*t/k;
double x=-b/(2.00\*a);
double ans;
if(x>=l&&x<=r)
{
ans=(\*a\*c-b\*b)/(\*a);
// db(a\*x\*x+b\*x+c);
}else
{
ans=a\*l\*l+b\*l+c;
ans=max(ans,a\*r\*r+b\*r+c);
}
ans+=eps;
ans=max(0.0,ans-eps);
cout<<fixed<<setprecision()<<ans<<endl;
return ;
}
inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '');
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * - ch + '';
}
}
else {
*p = ch - '';
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * + ch - '';
}
}
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章