HDU 2298 Toxophily(水~)

本文探讨了从原点出发,以特定速度向目标射击的问题,并提供了一种数学方法来确定能够击中目标所需的最小发射角度。通过解析方程,文章详细解释了如何计算两个可能的角度,并选择符合条件的最小值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description
从(0,0)点射箭,速度为v,重力加速度g=9.8,想射到(x,y)处的一个苹果,求最小出射角度
Input
第一行为一整数T表示用例组数,每组用例为三个浮点数x,y,v表示苹果位置和箭的出射速度(T<=100,1<=x,y,v<=10000)
Output
对于每组用例,如果可以射到苹果则输出最小出射角度,否则输出-1
Sample Input
3
0.222018 23.901887 121.909183
39.096669 110.210922 20.270030
138.355025 2028.716904 25.079551
Sample Output
1.561582
-1
-1
Solution
这里写图片描述
判断一下x1,x2是否在[0,pi]之间然后选一个合法的较小值即可
Code

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
#define g 9.8
#define pi acos(-1.0)/2.0
int main()
{
    int T;
    double x,y,v;
    scanf("%d",&T); 
    while(T--)
    {
        scanf("%lf%lf%lf",&x,&y,&v);
        double a=g*x*x;
        double b=-2.0*x*v*v;
        double c=2.0*y*v*v+g*x*x;
        double d=b*b-4.0*a*c;
        if(d<0)
        {
            printf("-1\n");
            continue;
        }
        d=sqrt(d);
        double x1=atan((-b+d)/(2.0*a)),x2=atan((-b-d)/(2.0*a));
        if(x1<0||x1>pi&&x2<0||x2>pi)printf("-1\n");
        else if(x1<0||x1>pi)printf("%.6lf\n",x2);
        else if(x2<0||x2>pi)printf("%.6lf\n",x1);
        else printf("%.6lf\n",x1<x2?x1:x2);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值