Toxophily HDU - 2298 三分+二分

题目:https://vjudge.net/contest/364745#problem/B

先用三分求出最高点Y,然后在进行二分,求出角度

注意写法   PI的弧度是  

acos(-1)/2-EPS接近90度的时候相当于除以0
二分的精度可以用迭代次数来保证,比如100次
#include <iostream>
#include <cmath>
using namespace std;
const double EPS = 1e-8;
int T; double x, y, v;
double f(double a)//角度为a时对应的高度
{
    double t = x/(v*cos(a));
    return v*sin(a)*t - 9.8/2*t*t;
}
int main()
{
    cin >> T;
    while(T--)
    {
        cin >> x >> y >> v;
        double L = 0, R = acos(-1)/2-EPS;
        if(x==0) //特判,否则三角函数会智障掉
        {
            if(v*v/2/9.8 > y) printf("%.6lf\n", R);
            else printf("-1\n");
            continue;
        }
        for(int i=1;i<=100;i++)
        {
            double mid_L = (L+R) / 2;
            double mid_R = (mid_L+R) / 2;
            if(f(mid_L) > f(mid_R))
            {
                R = mid_R;
            } else {
                L = mid_L;
            }
        }
        if(f(L) < y) {printf("-1\n"); continue;}
        R = L, L = 0;
        for(int i=1;i<=100;i++)
        {
            double mid = (L+R)/2;
            if(f(mid) < y)
            {
                L = mid;
            } else {
                R = mid;
            }  
        }
        printf("%.6lf\n", L);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洛阳八中我最棒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值