首页 > 代码库 > HDU -2298 Toxophily
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))//关键代码,若前一个大于后一个值,则右端点前移到mmid22 r = mmid;23 else24 l = mid;//否则,左端点后移到中点mid25 mid = (l + r) / 2;//接着再求他们的mid和mmid26 mmid = (mid + r) / 2;27 }28 if(EXP(mid) < y)//当最大值不满足所给的y的时候,这时候打印-129 {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 else41 l = mid;42 mid = (l + r) / 2;43 }44 printf("%.6lf\n", mid);45 }46 return 0;47 }
HDU -2298 Toxophily
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。