HDU -2298 Toxophily

这道题目,可以推出物理公式直接来做,但是如果退不出来就必须用程序的一种算法来实现了,物理公式只是适合这一个或者某个题,但是这种下面这种解决问题的方法确实解决了一类问题 ----三分法,大家可能都听说过二分法,没有听说三分法,确实三分法很冷,但是学会了就是学会了,而且他的计算速度并不慢,时间复杂度是log型的,所以推荐大家学会这种方法,下面是具体的代码实现,包括怎么三分的过程,不是平均分成三段,而是先分成一半,在接着把后面的一半接着再分一半:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <math.h>
 4 #define EPS 1e-8//定义精度
 5 #define EXP(r) x * tan(r) - 4.9 * x * x  * (tan(r) * tan(r) + 1) / (v * v)//定义推出来的式子,
 6 //这个可以根据简单的公式就可以计算出来,设出来两个未知数,两个式子,一定可以解出来
 7 #define PI 3.141592653589732384626433832795 //宏定义PI,这个的结果可以用Windows上带的计算器直接写上,比那个atan要快
 8 int main()
 9 {
10     int t;
11     scanf("%d", &t);
12     while(t --)
13     {
14         double x, y, v;
15         scanf("%lf %lf %lf", &x, &y, &v);
16         double l = 0; double r = PI * 0.5; double mid; double mmid;
17         mid = (l + r) / 2;//mid代表中点
18         mmid = (mid + r) / 2;//mmid代表中点和右边的区间点之间的中点
19         while(fabs(mid - mmid) > EPS)//执行条件,当他们之间的差值的绝对值大于精度时,继续循环
20         {
21             if(EXP(mid) > EXP(mmid))//关键代码,若前一个大于后一个值,则右端点前移到mmid
22                 r = mmid;
23             else
24                 l = mid;//否则,左端点后移到中点mid
25             mid = (l + r) / 2;//接着再求他们的mid和mmid
26             mmid = (mid + r) / 2;
27         }
28         if(EXP(mid) < y)//当最大值不满足所给的y的时候,这时候打印-1
29         {
30             printf("-1\n");
31             continue;//继续下一次循环
32         }
33         r = mmid;
34         l = 0;
35         mid = (l + r) / 2;
36         while(fabs(EXP(mid) - y) > EPS )//如果满足则要求出来这个弧度来,也是执行到大于精度
37         {
38             if(EXP(mid) > y)
39                 r = mid;
40             else
41                 l = mid;
42             mid = (l + r) / 2;
43         }
44         printf("%.6lf\n", mid);
45     }
46     return 0;
47 }
时间: 2024-10-09 07:46:34

HDU -2298 Toxophily的相关文章

hdu 2298 - Toxophily [二分]

Toxophily                Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1440    Accepted Submission(s): 749 Problem Description The recreation center of WHU ACM Team has indoor billiards, Ping

HDU 2298:Toxophily(推公式)

http://acm.hdu.edu.cn/showproblem.php?pid=2298 题意:给出一个x,y,v,问从(0,0)以v为初速度射箭,能否射到(x,y)这个点,如果能,输出最小的射出角度(与x轴),否则输出-1. 思路:首先考虑不能到达的情况,由动能定理mgy > 1 / 2 * m * v * v的时候,就输出-1. 然后可以列出两个式子: x = v * t * cos(θ)  ① y = v * t * sin(θ) - 1 / 2 * g * t * t. ② 把①带入

「HDU 2298」Toxophily

题意:原题在这 假设LCY站在(0,0)点,现给定平面直角坐标系内ZJ坐标,求ZJ与LCY的连线与X轴连线的角度取g=9.8m/s² 思路: 感谢Beef的运动学分析及奇怪的口音让我差点打不出来“θ” 首先∵速度是斜方向的,所以Vx=V·cosθ,Vy=V·sinθ 又∵Sx=Vx·t,Sy=Vy·t ∴X=Vcosθ·t,Y=Vsinθ·t 到此为止理论分解完成了 -----------------------------------------------------------------

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; d

Toxophily-数论以及二分三分

G - Toxophily Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2298 Description The recreation center of WHU ACM Team has indoor billiards, Ping Pang, chess and bridge, toxophily, deluxe ballroom

转载:hdu 题目分类 (侵删)

转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029. 1032.1037.1040.1048.1056.1058.1061.1070.1076.1089.1090.1091.1092.1093. 1094.1095.1096.1097.1098.1106.1108.1157.116

hdu 2199:Can you solve this equation?(二分搜索)

Can you solve this equation? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7493    Accepted Submission(s): 3484 Problem Description Now,given the equation 8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == Y,

HDU 2143 Can you find it?(基础二分)

Can you find it? Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/10000 K (Java/Others)Total Submission(s): 42520    Accepted Submission(s): 10315 Problem Description Give you three sequences of numbers A, B, C, then we give you a numbe

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;