G - Toxophily

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

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
 

Sample Output

1.561582
-1
-1
 
第一种是通过数学公式求解,另外一种是三分一次高度所相应的倾斜角,再二分符合条件的倾斜角
公式法:

有题目能够知道:x,y,v都是已知条件

设vx=v*cos(α),vy=v*sin(α),同一时候从P(0,0)点到达目标点花了t时间,重力加速度为G=9.8.

∴x=vx*t,y=vy*t-1/2*G*t².

消掉vx,vy,t能够转换为y=v*sin(α)*x/(v*cos(α))-1/2*g*x²/(v²*cos(α)²).

∴将sin(α)/cos(α)=tan(α);

∴y=v*x*tan(α)-(1/2*g*x²/v²)*((sin(α)²+cos(α)²)/cos(α)²);

∴y=v*x*tan(α)-(1/2*g*x²/v²)*(1+tan(α)²);

∴将其进行整理能够得到:g*x²*tan(α)²-2*v²*x*tan(α)+2*v²y+g*x²=0;

∴能够得到△=b²-4*a*c;

∴令a=g*x²,b=-2*v²*x,c=2*v²y+g*x².

又∵x1=(-b+(b²-4*a*c)½)/(2*a),x2=(-b-(b²-4*a*c)½)/(2*a).

∴能够通过上述公式将tan(α)求出,然后就是通过atan((tan(α)))将α求出

接着检查α是否符合条件就能够了。
/*
Author: 2486
Memory: 1616 KB Time: 0 MS
Language: C++ Result: Accepted
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const double PI=acos(-1);
const double G=9.8;
int T;
double x,y,v;
int main() {
scanf("%d",&T);
while(T--) {
scanf("%lf%lf%lf",&x,&y,&v);
double a=G*x*x,b=-2.0*v*v*x,c=2.0*v*v*y+G*x*x;
double posi=(-b+sqrt(b*b-4.0*a*c))/2.0/a;
double ne=(-b-sqrt(b*b-4.0*a*c))/2.0/a;
posi=atan(posi),ne=atan(ne);
if(posi>=0&&posi<=PI/2.0&&ne>=0&&ne<=PI/2.0) {
printf("%.6lf\n",posi>ne? ne:posi);
} else if(ne>=0&&ne<=PI/2.0) {
printf("%.6lf\n",ne);
} else if(posi>=0&&posi<=PI/2.0) {
printf("%.6lf\n",posi);
} else printf("-1\n");
}
return 0;
}

三分二分方法

/*
Author: 2486
Memory: 1628 KB Time: 0 MS
Language: C++ Result: Accepted
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const double PI=acos(-1);
const double eps=1e-10;
int T;
double x,y,v;
double C(double m) {
double vx=v*cos(m),vy=v*sin(m);
return (vy*x)/vx-9.8*(x/vx*x/vx)/2.0;
}
bool B(double m) {
double vx=v*cos(m),vy=v*sin(m);
return (vy*x)/vx-9.8*(x/vx*x/vx)/2.0>=y;
}
int main() {
scanf("%d",&T);
while(T--) {
scanf("%lf%lf%lf",&x,&y,&v);
double lb=0,ub=PI/2.0;
///////////////求出最大高度所相应的倾斜度////////////////
while(ub-lb>eps) {
double mid=(ub+lb)/2.0;
double mmid=(ub+mid)/2.0;
if(C(mid)>C(mmid)) {
ub=mmid;
} else lb=mid;
}
if(C(ub)<y) {
printf("-1\n");
continue;
}
///////////////////////////////
lb=0;
////////////////求出无限接近目标的倾斜度///////////////
while(ub-lb>eps) {
double mid=(ub+lb)/2.0;
if(B(mid)) {
ub=mid;
} else lb=mid;
}
///////////////////////////////
printf("%.6lf\n",ub);
}
return 0;
}

Toxophily-数论以及二分三分的更多相关文章

  1. 第二次组队赛 二分&三分全场

    网址:CSUST 7月30日(二分和三分) 这次的比赛是二分&三分专题,说实话以前都没有接触过二分,就在比赛前听渊神略讲了下.......不过做着做着就对二分熟悉了,果然做题是学习的好方法啊~ ...

  2. HDU 2298 Toxophily 【二分+三分】

    一个人站在(0,0)处射箭,箭的速度为v,问是否能够射到(x,y)处,并求最小角度. 首先需要判断在满足X=x的情况下最大高度hmax是否能够达到y,根据物理公式可得 h=vy*t-0.5*g*t*t ...

  3. CF 8D Two Friends 【二分+三分】

    三个地点构成一个三角形. 判断一下两个人能否一起到shop然后回家,如果不能: 两个人一定在三角形内部某一点分开,假设沿着直线走,可以将问题简化. 三分从电影院出来时候的角度,在对应的直线上二分出一个 ...

  4. Codeforces Gym100543B 计算几何 凸包 线段树 二分/三分 卡常

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF-Gym100543B.html 题目传送门 - CF-Gym100543B 题意 给定一个折线图,对于每一条 ...

  5. CodeForces - 1059D——二分/三分

    题目 题目链接 简单的说,就是作一个圆包含所有的点且与x轴相切,求圆的最小半径 方法一 分析:求最小,对半径而言肯定满足单调性,很容易想到二分.我们二分半径,然后由于固定了与X轴相切,我们对于每一个点 ...

  6. uva 1463 - Largest Empty Circle on a Segment(二分+三分+几何)

    题目链接:uva 1463 - Largest Empty Circle on a Segment 二分半径,对于每一个半径,用三分求出线段到线段的最短距离,依据最短距离能够确定当前R下每条线段在[0 ...

  7. HDU2899Strange fuction(二分/三分)

    传送门 题目大意:求 F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100):的最小值 题解:求个导,二分导函数零点,就是原函数最小值所在的 ...

  8. [CSP-S模拟测试]:柱状图(树状数组+二分+三分)

    题目描述 $WTH$获得了一个柱状图,这个柱状图一共有$N$个柱子,最开始第$i$根柱子的高度为$x_i$,他现在要将这个柱状图排成一个屋顶的形状,屋顶的定义如下:$1.$屋顶存在一个最高的柱子,假设 ...

  9. 2020牛客寒假算法基础集训营5 B.牛牛战队的比赛地 (二分/三分)

    https://ac.nowcoder.com/acm/contest/3006/B 三分做法 #include<bits/stdc++.h> #define inf 0x3f3f3f3f ...

随机推荐

  1. Android Exception 9(requestFeature() must be called before adding content)

    08-05 17:36:12.799: W/System.err(10378): java.lang.reflect.InvocationTargetException08-05 17:36:12.7 ...

  2. Ubuntu Server 12.04 安装 Jabberd2 服务器

    本篇文章由:http://xinpure.com/install-ubuntu-server-12-04-jabberd2-server/ Ubuntu Server 12.04 安装 Jabberd ...

  3. DevExpress SpinEdit控件使用实例——删除ASPxSpinEdit右边的上下小箭头SpinButtons-ShowIncrementButtons

    使用ASPxSpinEdit来添加数字类型的输入框: 默认情况下, SpinEdit通过点击右边的上下箭头来加减number,下面的代码是去掉上下箭头,内容居中显示,并将边框颜色置为白色: <d ...

  4. Linux中使用Crontab定时监测维护Tomcat应用程序的方法

    Linux中使用Crontab定时监测维护Tomcat应用程序的方法 功能需求: 定时监测发布的某项应用程序是否可用,如果不可用,立即执行处理措施,实现自动化运维工作. 监测的应用接口: 新闻接口.天 ...

  5. nopi使用 设置列样式 宽高 设置分页符

    HSSFWorkbook book = new HSSFWorkbook(); ISheet sheet = book.CreateSheet("test_01"); sheet. ...

  6. nodejs 中使用shell脚本

    虽然nodejs的require('child_process').execSync可以使用shell,但其实问题特别多.尤其是符号和语法冲突,可读性也很差,只能完成一些小规模的shell使用. co ...

  7. Vue 中的生命周期和钩子函数

    生命周期: beforeCreate:el 和 data 并未初始化 (此方法不常用) created:完成了 data 数据的初始化,el的初始化未完成.用来发送ajax beforeMount:( ...

  8. securtCRT右键复制功能配置

    Options->Global Options->Terminal 在右边选择或者取消“Copy on select”和“Paste on right button”的勾选即可打开或者关闭 ...

  9. 什么是ETag

    ETag 是 Entity Tag 的缩写,中文译过来就是实体标签的意思.在HTTP1.1协议中其实就是请求HEAD中的一个属性而已. HTTP/1.1 200 OK Date: Mon, 23 Ma ...

  10. MySQL 错误号码 1449

    出现类似的问题是由于权限问题,授权给root所有sql权限即可: mysql> grant all privileges on *.* to root@"%" identif ...