HDU 5144 三分

开始推导用公式求了好久(真的蠢),发现精度有点不够。

其实这种凸线上求点类的应该上三分法的,当作入门吧...

/** @Date    : 2017-09-23 21:15:57
  * @FileName: HDU 5144 三分 无聊物理题.cpp
  * @Platform: Windows
  * @Author  : Lweleth ([email protected])
  * @Link    : https://github.com/
  * @Version : $Id$
  */
#include <bits/stdc++.h>
#define LL long long
#define PII pair<int ,int>
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std;

const int INF = 0x3f3f3f3f;
const int N = 1e5+20;
const double eps = 1e-8;
const double Pi = acos(-1.0);
const double g = 9.80;

double check(double agl, double v0, double h)
{
	double va = v0 * sin(agl);
	double vb = v0 * cos(agl);
	double c = 2 * g * h;
	double t1 = va / g;
	double t2 = sqrt(c + va * va) / g;
	double x = (t1 + t2) * vb;
	return x;
}

int main()
{
	int T;
	cin >> T;
	while(T--)
	{
		double h, v;
		scanf("%lf%lf", &h, &v);
		double l = 0, r = Pi / 2.0;
		while(r - l > eps)
		{
			double lmid = l + (r - l) / 3.00;
			double rmid = r - (r - l) / 3.00;
			if(check(lmid,v,h) > check(rmid,v,h))
				r = rmid;
			else l = lmid;
		}
		printf("%.2lf\n", check(l,v,h));
	}
    return 0;
}
时间: 2024-10-29 10:46:37

HDU 5144 三分的相关文章

hdu 5144 NPY and shot

http://acm.hdu.edu.cn/showproblem.php?pid=5144 题意:给你初始的高度和速度,然后让你求出水平的最远距离. 思路:三分枚举角度,然后根据公式求出水平距离. 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 using namespace std; 6 const double pi=acos(-1

hdu 4717(三分) The Moving Points

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4717 n个点,给出初始坐标和移动的速度和移动的方向,求在哪一时刻任意两点之间的距离的最大值的最小. 对于最大值的最小问题首先就会想到二分,然而由于两点之间的距离是呈抛物线状,所以三分的方法又浮上脑海,当然二分也可以做,不过思维上更复杂一些 1 #include<cmath> 2 #include<cstdio> 3 #include<cstring> 4 #include<

hdu 4717 三分查找

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4717 题      意:n个点的起始坐标和它们的运动方向,求这n个点的在哪个时刻最远距离最小 题      解:两点的距离为一个二次函数,对时间进行三分查找答案 #include <iostream> #include <cstdio> #include <cmath> using namespace std; struct point { double x,y; doub

HDU 5144

题意:在给定的高度和初速度,任意抛使得它水平距离最远. 题解:我们可以很容易的推出 length = v*cos(x)*( sqrt( 2.0*h*g + v*v*sin(x)*sin(x) ) + v*sin(x) ) / g; 然后对 [ 0, π/2 ] 之间的弧度三分查找(凸线图形一般用三分) 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.

HDU 5144 NPY and shot(三分法)

当时做这道题时一直想退出物理公式来,但是后来推到导数那一部分,由于数学不好,没有推出来那个关于Θ的最值,后来直接暴力了,很明显超时了,忘了三分法的应用,这道题又是典型的三分求最值,是个单峰曲线,下面是代码 1 #include <stdio.h> 2 #include <math.h> 3 #define PI 3.1415926 4 int v, h; 5 double f(double i)//推倒物理公式 6 { 7 return v*v*1.0*sin(2*i)/9.8+(

hdu 2899 hdu 3400 三分/几何

hdu2899 : 水提,直接三分,其实求导后二分也可以. #include<iostream> #include<cstdio> using namespace std; double y; double inline f( long double x) { return 6*x*x*x*x*x*x*x+8*x*x*x*x*x*x+7*x*x*x+5*x*x-y*x; } int main() { int T;scanf("%d",&T); while

hdu 3400(三分)

题目链接:点击打开链接: 题意:本题给出两条线段,一条线段端点为a,b:另一条线段端点是c,d,在两条线段和不在线段上有不同的速度,求最短时间. 分析:本题一共有三段时间,在a-b上,在c-d上,在空白的地方.设着三段时间是x,y,z.则一旦x和y确定之后,z就能确定,因为这样在两线段上的点就确定了,z也就求出来了,如果x确定时y不确定的话,z和y有关系,所以时间是有一个极值,想到极值,就应该三分求最适合的y.而对于x来说,三分求解x的话可以搞出对应点的y的极值,也就能求出队应的y的极值.这是就

Toxophily HDU - 2298 三分+二分

题目:https://vjudge.net/contest/364745#problem/B 先用三分求出最高点Y,然后在进行二分,求出角度 注意写法   PI的弧度是 acos(-1)/2-EPS接近90度的时候相当于除以0二分的精度可以用迭代次数来保证,比如100次 #include <iostream> #include <cmath> using namespace std; const double EPS = 1e-8; int T; double x, y, v; d

hdu 4717 The Moving Points(三分)

题目链接:hdu 4717 The Moving Points 题意: 在二维平面上有n个点,每个点给出移动的方向和速度. 问在某个时刻,这些点中最大距离最小是多少,输出时刻和距离. 题解: 我们可以知道,每个点对的距离要么是单调递增,要么是有一个峰的函数. 举例画一下可知道合成的这个函数最多只有一个峰,所以可以用三分求解. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespa