精华内容
下载资源
问答
  • HDU 2298 Toxophily(公式/三分+分)

    千次阅读 2015-07-24 08:51:51
    有两种思路,第一种是直接假设能够击中目标,写出公式,化成一元二次方程,把公式内的三角函数全部化成tan,判断[0,PI/2]有无解;第二种方法就是三分+二分,首先三分仰角,出轨迹在x处的纵坐标,若纵坐标最大值...

    Toxophily

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1429    Accepted Submission(s): 739


    Problem Description
    The recreation center of WHU ACM Team has indoor billiards, Ping Pang, chess and bridge, toxophily, deluxe ballrooms KTV rooms, fishing, climbing, and so on.
    We all like toxophily.

    Bob is hooked on toxophily recently. Assume that Bob is at point (0,0) and he wants to shoot the fruits on a nearby tree. He can adjust the angle to fix the trajectory. Unfortunately, he always fails at that. Can you help him?

    Now given the object's coordinates, please calculate the angle between the arrow and x-axis at Bob's point. Assume that g=9.8N/m. 
     

    Input
    The input consists of several test cases. The first line of input consists of an integer T, indicating the number of test cases. Each test case is on a separated line, and it consists three floating point numbers: x, y, v. x and y indicate the coordinate of the fruit. v is the arrow's exit speed.
    Technical Specification

    1. T ≤ 100.
    2. 0 ≤ x, y, v ≤ 10000. 
     

    Output
    For each test case, output the smallest answer rounded to six fractional digits on a separated line.
    Output "-1", if there's no possible answer.

    Please use radian as unit. 
     

    Sample Input
    3 0.222018 23.901887 121.909183 39.096669 110.210922 20.270030 138.355025 2028.716904 25.079551
     


    已知发射点坐标为(0,0)和重力加速度g=9.8,给出目标的坐标和初速度,求能够击中目标的最小仰角。有两种思路,第一种是直接假设能够击中目标,写出公式,化成一元二次方程,把公式内的三角函数全部化成tan,判断[0,PI/2]有无解;第二种方法就是三分+二分,首先三分仰角,求出轨迹在x处的纵坐标最大值,若纵坐标最大值小于y,则直接输出-1,三分过后[0,r]上就是单调递增的,直接二分即可。


    #include<stack>//推导公式
    #include<queue>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #pragma commment(linker,"/STACK: 102400000 102400000")
    #define mset0(t) memset(t,0,sizeof(t))
    #define lson a,b,l,mid,cur<<1
    #define rson a,b,mid+1,r,cur<<1|1
    using namespace std;
    const double PI=3.141592653;
    const double eps=1e-8;
    const int MAXN=500020;
    const double g=9.8;
    double x,y,v,ans;
    
    int main()
    {
    #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
    #endif // ONLINE_JUDGE
        int tcase;
        scanf("%d",&tcase);
        while(tcase--)
        {
            scanf("%lf%lf%lf",&x,&y,&v);
            /*if(x==0||y==0)    //这个if语句主要是用来特判0 50 10000这种数据的,但不知道为什么去掉这个也能AC
            {
                if(x==0&&y==0)
                    printf("0.000000\n");
                else if(y==0)
                    printf("-1\n");
                else
                    if(v*v*0.5/g>=y)
                        printf("%.6lf\n",PI/2);
                    else
                        printf("-1\n");
                continue;
            }*/
            ans=3;
            double a=g*x*x;
            double b=-2*v*v*x;
            double c=2*v*v*y+g*x*x;
            double der=b*b-4*a*c;
            if(der<0)
            {
                printf("-1\n");
                continue;
            }
            double ans1=atan((-b-sqrt(der))/(2*a));
            double ans2=atan((-b+sqrt(der))/(2*a));
            if(ans1>=0&&ans1<=PI/2)
                ans=min(ans,ans1);
            if(ans2>=0&&ans2<=PI/2)
                ans=min(ans,ans2);
            printf("%.6lf\n",ans);
        }
        return 0;
    }



    #include<stack>//三分+二分代码
    #include<queue>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #pragma commment(linker,"/STACK: 102400000 102400000")
    #define mset0(t) memset(t,0,sizeof(t))
    #define lson a,b,l,mid,cur<<1
    #define rson a,b,mid+1,r,cur<<1|1
    using namespace std;
    const double PI=3.141592653;
    const double eps=1e-8;
    const int MAXN=500020;
    const double g=9.8;
    double x,y,v,ans;
    
    double geth(double r)
    {
        return (v*sin(r))*(x/(v*cos(r)))-0.5*g*(x/(v*cos(r)))*(x/(v*cos(r)));
    }
    
    int main()
    {
    #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
    #endif // ONLINE_JUDGE
        int tcase;
        scanf("%d",&tcase);
        while(tcase--)
        {
            scanf("%lf%lf%lf",&x,&y,&v);
            if(x==0&&y==0)
            {
                printf("0.000000\n");
                continue;
            }
            if(y==0)
            {
                printf("-1\n");
                continue;
            }
            if(x==0)
            {
                if(v*v*0.5/g>=y)
                    printf("%.6lf\n",PI/2);
                else
                    printf("-1\n");
                continue;
            }
            double l=0,r=PI/2;
            int cnt=10000;
            while(cnt--)
            {
                double mid=(l+r)/2;
                double mmid=(mid+r)/2;
                if(geth(mid)>geth(mmid))
                    r=mmid;
                else
                    l=mid;
            }
            if(geth(r)<y)
            {
                printf("-1\n");
                continue;
            }
            l=0;
            r=r;
            cnt=10000;
            while(cnt--)
            {
                double mid=(l+r)/2;
                if(geth(mid)>y)
                    r=mid;
                else
                    l=mid;
            }
            printf("%.6lf\n",r);
            
        }
        return 0;
    }



    展开全文
  • 1.7.5 使用公式求值器 36 1.8 处理公式中的错误 36 1.8.1 括号不匹配 37 1.8.2 单元格被#符号填满 37 1.8.3 空白但非空的单元格 37 1.8.4 显示与实际 38 1.8.5 返回错误 39 1.8.6 循环引用 41 1.9 ...
  • 为了更好的理解梯度下降法,首先,求解一个一元二次函数的系数,为了方便计算,假设方程为最终的要求,就是出k。首先,我们设定误差函数为其中,Y是实际输出,Out是通过前向计算得到的结果。基于该公式,我们...

    梯度下降法,就是求函数在某一点的导数/偏导数,在该方向上,函数的变化率最大,也就是说,在优化目标函数的时候,只要按照梯度的负方向优化即可。

    为了更好的理解梯度下降法,首先,求解一个一元二次函数的系数,为了方便计算,假设方程为


    最终的要求,就是求出k值。

    首先,我们设定误差函数为


    其中,Y是实际输出,Out是通过前向计算得到的结果。

    基于该公式,我们可以得到误差函数的导数

    但是在实际的计算过程中,我发现了一个问题,Error的负梯度本应该是取负值,也就是说,k的更新应该按照下述公式调整


    但是在实际的结算过程中,以 x = 2, y = 2进行训练,最终k的变化结果如下:

                                  

    总共设置了100次的迭代次数,k值应该为1,但是显然,k的值越来越小,离收敛的请也越来越远,这是什么原因?

    问题出在了误差函数上,误差函数采用的是平方和,不管是(Y - Out)或者(Out - Y )都没有影响,但是在求导数的阶段,不同的误差导数就决定了k的修正方向,方向相反的情况下,k值只会越来越偏离真实结果。

    为了解决这个问题,就需要确定误差函数究竟是(Y - Out)还是(Out - Y ),实际上,将问题进行简化,要让k接近真实值,那么误差值的方向应该与Out的方向相反,这里如果将Y当成一个常数,可以看到,对k求偏导时,只有Out起作用,基于此,可以看到,误差结果(Out - Y)的梯度方向才是正方向,那么其负梯度方向应该是 - (Out - Y),则k的调整公式应为


    当然,如果将(Out - Y)写成(Y - Out),那么上式就变成了我们熟悉的公式


    基于该公式再进行训练,设置误差率为0.01,k的变化曲线如下:

                                  

    可以看到,经过了27次迭代之后,输出结果已经很接近1了。

    展开全文
  • 过点(x1,f(x1))做曲线y = f(x)的切线,并该切线与x轴的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似。重复以上过程,得r的近似序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的n+1次近似,上式称为...
  • 就是解一元二次方程,用高中学的公式,函数开口向上,求最大值为(4ac-b*b)/4a。 这个题推出来一元二次方程,然后将最大值的公式化简一下。公式很好推。 这个题有疑问,int vx=v11-v1,vy=v22-v2;这样写是对的,反...

     

    这个题直接推公式就可以。

    就是解一元二次方程,用高中学的公式,函数开口向上,求最大值为(4ac-b*b)/4a。

    这个题推出来一元二次方程,然后将最大值的公式化简一下。公式很好推。

    这个题有疑问,int vx=v11-v1,vy=v22-v2;这样写是对的,反过来写成v1-v11,v2-v22就不对,WA1,但是样例什么的是对的,搞不懂为什么。

     

    代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<math.h>
     5 #include<algorithm>
     6 using namespace std;
     7 int main(){
     8     int x1,y1,x2,y2;
     9     int v1,v2,v11,v22;
    10     double ans;
    11     while(cin>>x1>>y1>>x2>>y2){
    12         cin>>v1>>v2>>v11>>v22;
    13         int vx=v11-v1,vy=v22-v2;
    14         if((y1-y2)*vy+(x1-x2)*vx<0||(vx==0&&vy==0))ans=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
    15         else ans=fabs(((x1-x2)*vy-(y1-y2)*vx)/sqrt(vx*vx+vy*vy));
    16         printf("%.15f\n",ans);
    17     }
    18     return 0;
    19 }

     

    转载于:https://www.cnblogs.com/ZERO-/p/9703038.html

    展开全文
  • 练习2————1004

    2016-04-20 12:04:09
    思路:(1)直接假设能够击中目标,写出公式,化成一元二次方程,把公式内的三角函数全部化成tan,判断[0,PI/2]有无解;  (2)运用三分+二分,首先三分仰角,出轨迹在x处的纵坐标,若纵坐标最大值小于y,则...

    题目:最小仰角

    题意:已知发射点坐标为(0,0)和重力加速度g=9.8,给出目标的坐标和初速度,求能够击中目标的最小仰角。

    思路:(1)直接假设能够击中目标,写出公式,化成一元二次方程,把公式内的三角函数全部化成tan,判断[0,PI/2]有无解;

             (2)运用三分+二分,首先三分仰角,求出轨迹在x处的纵坐标,若纵坐标最大值小于y,则直接输出-1,三分过后[0,r]上就是单调递增的,                  直接二分即可

    感想:要知道物理知识,

    代码:

    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    #include<numeric>
    #include<math.h>
    #include<cstdio>
    using namespace std;
    const double PI = 3.1415926535;
    const double eps = 1e-10;
    double g=9.8;
    int main()
    {
       int n;
       double x,y,v,ans;
        cin>>n; 
        while(n--)
        {
            cin>>x>>y>>v;
            double mid,l,r,vx,vy,t,mVal;
            l = 0;r = PI/2.0;
            bool suc = false;
            while(r-l>=eps)
    {
              mid = (l+r)/2.0;      
              vx = v*cos(mid),vy = v*sin(mid);t = x/vx;
              mVal = vy*t-0.5*9.8*t*t;
              if(mVal < y)
     {
                l = mid;
     }
              else if(mVal > y || vy/9.8 < t)
     {
                suc = true;
                ans = mid;
                r = mid;
     }
             else
    {
                suc = true;
                ans = mid;
                break;
             }
    }
        if(suc) printf("%.6lf\n",ans);
        else printf("-1\n");
    }
        return 0;
    }


    展开全文
  • 目录1110: 例题2-3 判断闰年1111: 例题2-4 简单公式计算1112: 例题2-5 判断素数1113: 习题2-4-2 多数求最大值1114: 习题2-4-3 三个数排序输出1115: 习题2-4-4 连续多数求和1116: 习题2-4-5 判断整除1117: 习题2-4-6 ...
  • C语言汇总计算e的绝对值计算pi的计算sinx求一元二次方程的根随机数种子例题随机猜数游戏静态变量的应用srand(time(NULL))数组入门指针入门指针与一维数组的关系数组输出一年各个月份的天数运用数组计算某班学生的...
  • ACM巨全模板 .pdf

    2019-10-07 11:51:34
    2.维RMQ区间最大值 (维区间极值) 3.线段树模板(模板为区间加法) (线段树染色) (区间最小值) 4.线性基 (异或第k大) 5.主席树(静态区间第k小) (区间中小于k的数量和小于k的总和) (区间中第一个大于或等于k的...
  • c语言经典案例

    2014-10-30 08:06:57
    实例052 求一元二次方程的根 69 实例053 自然对数的底e的计算 70 实例054 满足abcd=(ab+cd)2的数 70 实例055 整数加减法练习 71 实例056 判断整倍数 73 实例057 阶梯问题 73 实例058 乘积大于和的数 74 实例059 各...
  • 张宇带你学高数

    2018-06-11 13:35:26
    二次曲面 8.2.2.曲线 曲线的方程 一般方程 参数方程 曲线的投影 8.3.直线与平面 8.3.1.平面 概念 平面方程 点法式 一般方程 两平面的夹角 8.3.2.直线 概念 直线方程 一般方程 标准式 参数式 两直线的夹角 直线与平面...
  • 19.4.1 有限增量公式与拟微分平均定理 19.4.2 练习题 §19.5 对于教学的建议 19.5.1 学习要点 19.5.2 参考题 第十章 隐函数存在定理与隐函数求导 520.1 一个方程的情形 20.1.1 隐函数存在定理 20.1.2 隐函数求导...
  • 支持一元二次,一元一次,二元一次方程求值.支持正负数,小数系数输入,分数系数请先自行转换. 2.RC常数 RC时间常数是电路里经常用到的.该功能可以计算RC电路上,电容C到某个电压时候的充放电时间;也可以计算经过t时刻...
  • 支持一元二次,一元一次,二元一次方程求值.支持正负数,小数系数输入,分数系数请先自行转换. 2.RC常数 RC时间常数是电路里经常用到的.该功能可以计算RC电路上,电容C到某个电压时候的充放电时间;也可以计算经过t时刻...
  • LINGO软件的学习

    2009-08-08 22:36:50
    借助于集,能够用一个单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型。 2.2 什么是集 集是一群相联系的对象,这些对象也称为集的成员。一个集可能是一系列产品、卡车或...
  • 任何一个用于计算公式都可称为表达式。x = 5 + 7是一个表达式,它的为12。 2-9 下列表达式的是多少? 1. 201 / 4 2. 201 % 4 3. 201 / 4.0 解: 1. 50 2. 1 3. 50.25 2-10 执行完下列语句后,a、b、c三...
  • 实例188 泛型化接口与最大值 实例189 使用通配符增强泛型 实例190 泛型化的折半查找法 第9章 编程常用类 9.1 Calendar类的使用 实例191 简单的数字时钟 实例192 简单的电子时钟 实例193 简单的模拟时钟 实例...
  • 实例188 泛型化接口与最大值 实例189 使用通配符增强泛型 实例190 泛型化的折半查找法 第9章 编程常用类 9.1 Calendar类的使用 实例191 简单的数字时钟 实例192 简单的电子时钟 实例193 简单的模拟时钟 实例...
  • 实例188 泛型化接口与最大值 239 实例189 使用通配符增强泛型 240 实例190 泛型化的折半查找法 241 第9章 编程常用类 343 9.1 Calendar类的使用 244 实例191 简单的数字时钟 244 实例192 简单的电子时钟 245 实例193...
  • 实例188 泛型化接口与最大值 239 实例189 使用通配符增强泛型 240 实例190 泛型化的折半查找法 241 第9章 编程常用类 343 9.1 Calendar类的使用 244 实例191 简单的数字时钟 244 实例192 简单的电子时钟 245 实例193...

空空如也

空空如也

1 2
收藏数 21
精华内容 8
关键字:

一元二次求最大值公式