zoukankan      html  css  js  c++  java
  • 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
    ");
    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
    ", mid);
    45     }
    46     return 0;
    47 }
  • 相关阅读:
    在360工作的这几天
    ISBN号码
    poj 3667 Hotel
    命令模式之2 Invoker Vs. Client
    vehicle time series data analysis
    JSON之三:获取JSON文本并解释(以google的天气API为例)
    创建型模式--工厂方法模式
    OpenStack Heat总结之:Icehouse中通过Heat+Ceilometer实现Autoscaling
    MyEclipse10 中增加svn插件
    activitie用户手册
  • 原文地址:https://www.cnblogs.com/Howe-Young/p/3930941.html
Copyright © 2011-2022 走看看