HDU 2298 Toxophily(公式/三分+二分)
Toxophily
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1429 Accepted Submission(s): 739
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.
the fruit. v is the arrow's exit speed.
Technical Specification
1. T ≤ 100.
2. 0 ≤ x, y, v ≤ 10000.
Output "-1", if there's no possible answer.
Please use radian as unit.
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;
}
HDU 2298 Toxophily(公式/三分+二分)的更多相关文章
- HDU 2298 Toxophily 【二分+三分】
一个人站在(0,0)处射箭,箭的速度为v,问是否能够射到(x,y)处,并求最小角度. 首先需要判断在满足X=x的情况下最大高度hmax是否能够达到y,根据物理公式可得 h=vy*t-0.5*g*t*t ...
- HDU -2298 Toxophily(三分法)
这道题目,可以推出物理公式直接来做,但是如果推不出来就必须用程序的一种算法来实现了,物理公式只是适合这一个或者某个题,但是这种下面这种解决问题的方法确实解决了一类问题 ----三分法,大家可能都听说过 ...
- HDU 2298 Toxophily
题目: Description The recreation center of WHU ACM Team has indoor billiards, Ping Pang, chess and bri ...
- HDU 2298 三分
斜抛从(0,0)到(x,y),问其角度. 首先观察下就知道抛物线上横坐标为x的点与给定的点的距离与角度关系并不是线性的,当角度大于一定值时可能会时距离单调递减,所以先三分求个角度范围,保证其点一定在抛 ...
- hdu 3433 A Task Process 二分+dp
A Task Process Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HDU 3622 Bomb Game(二分+2-SAT)
Bomb Game Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- Toxophily HDU - 2298 三分+二分
代码+解析: 1 //题意: 2 //有一个大炮在(0,0)位置,为你可不可以把炮弹射到(x,y)这个位置 3 //题目给你炮弹初始速度,让你求能不能找出来一个炮弹射出时角度满足题意 4 //题解: ...
- HDU 2298:Toxophily(推公式)
http://acm.hdu.edu.cn/showproblem.php?pid=2298 题意:给出一个x,y,v,问从(0,0)以v为初速度射箭,能否射到(x,y)这个点,如果能,输出最小的射出 ...
- [hdu 2298] 物理推导+二分答案
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2298 #include<bits/stdc++.h> using namespace st ...
随机推荐
- Android 开发笔记___Application操作全局变量
只要app在运行中,他就是一个application.因此可以用它来保存一些全局变量 package com.example.alimjan.hello_world; import android.a ...
- 蓝桥杯-算法训练--ALGO-5 最短路
问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从1号点到其他点的最短路(顶点从1到n编号). 输入格式 第一行两个整数n, m. 接下来的m行,每行有三个 ...
- 巧用ecshop做淘宝客
一.第一步 下载文件,可以在http://www.ecshop.com/下载ecshop各个版本的安装包,安装好ECSHOP,然后通过PTF工具下载2个文件到本地进行修改.这个2个文件分别是goods ...
- Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例
由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二 ...
- hiero_v2.0的下载安装和使用
程序地址:http://www.n4te.com/hiero/hiero.jnlp http://slick.cokeandcode.com/demos/hiero.jnlp(目测该网址需翻*墙才能进 ...
- TCollector
TCollector tcollector is a client-side process that gathers data from local collectors and pushes th ...
- 用StringBuilder和StringBuffer实现的Unicode解码方法的比较(Java)
初衷是用正则来写一个Unicode字符串转码的方法,一开始是打算结合StringBuilder写的,但是看到jdk7的Matcher.appendReplacement文档中一段示例代码用了Match ...
- Oracle常用的数值函数,日期函数
---恢复内容开始--- 数值函数 常用的处理数值的函数有如下: No. 函数名 含义 1 round(x[,y]) 返回四舍五入后的值 2 trunc(x[,y]) 不会四舍五入 3 mod(x,y ...
- hibernate:There is a cycle in the hierarchy! 造成死循环解决办法
下面是报的异常:在网上搜了关于:There is a cycle in the hierarchy!,才知道原来是因为死循环造成的!解决了好久,没有成功,后台不得已请教老大,老大说是因为在使用JSON ...
- Mybatis查询时报 Bad format for Time '454:54:54' in column 6 异常
报 Bad format for Time '454:54:54' in column 6 解决方案:1. 查询实体类和.xml数据是否相对应 2. 查询sql是否正确 3. 查看表的设计,是 ...