链接:https://www.nowcoder.com/acm/contest/200/E
来源:牛客网
第一行一个正整数T
接下来T行每行两个实数H,v
T行每行一个数,保留五位小数。
解题思路:题目给出了我们要推的式子
将t再带入第1个式子,得出水平距离x随时间t变化的函数
然后,会求导的求导,不会的根据窝们的常识,扔东西的时候,随着我们的角度增加,距离式先变大在变小的。
一个单峰函数求最值的问题,三分的模板:https://blog.csdn.net/littlewhite520/article/details/70144763
附上代码:
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-6;
const double g=9.80665;
const double pi2=1.570796327;
double H,v;
double f(double th)
{
return (v*sin(th)+sqrt(v*v*sin(th)*sin(th)+2*g*H))*v*cos(th)/g;
}
void three_divide()
{
double l=0,r=pi2;
while(r-l>=eps)
{
double mid1=l+(r-l)/3.0;
double mid2=r-(r-l)/3.0;
if(f(mid1)<=f(mid2))
l=mid1;
else
r=mid2;
}
printf("%.5lf\n",f(l));
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lf%lf",&H,&v);
three_divide();
}
return 0;
}
原文:https://www.cnblogs.com/zjl192628928/p/9746746.html