HDOJ 5144 NPY and shot(三分)
2014-12-15 09:01
337 查看
原函数为单峰函数,所以不能用二分。
#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
using namespace std;
const double pi = acos(-1.0);
const double g = 9.8;
double h, v, l, r, ml, mr, k;
double f(double ang)
{
double a = -g / 2, b = v * sin(ang), c = h;
double d = sqrt(b * b - 4 * a * c);
double t = -(b + d) / (2 * a);
return cos(ang) * v * t;
}
int main()
{
// freopen("C.in", "r", stdin);
int T;
scanf("%d", &T);
while(T--)
{
scanf("%lf%lf", &h, &v);
l = 0, r = pi/2;
for(int i = 0; i < 60; i++)
{
k = (r - l) / 3;
ml = l + k, mr = r - k;
if (f(ml) < f(mr)) l = ml;
else r = mr;
}
printf("%.2lf\n", f(l));
}
return 0;
}
#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
using namespace std;
const double pi = acos(-1.0);
const double g = 9.8;
double h, v, l, r, ml, mr, k;
double f(double ang)
{
double a = -g / 2, b = v * sin(ang), c = h;
double d = sqrt(b * b - 4 * a * c);
double t = -(b + d) / (2 * a);
return cos(ang) * v * t;
}
int main()
{
// freopen("C.in", "r", stdin);
int T;
scanf("%d", &T);
while(T--)
{
scanf("%lf%lf", &h, &v);
l = 0, r = pi/2;
for(int i = 0; i < 60; i++)
{
k = (r - l) / 3;
ml = l + k, mr = r - k;
if (f(ml) < f(mr)) l = ml;
else r = mr;
}
printf("%.2lf\n", f(l));
}
return 0;
}
相关文章推荐
- HDOJ 5144 NPY and shot 简单物理
- HDU 5144 NPY and shot(三分角度)
- HDU 5144 NPY and shot 三分(物理)
- HDU 5144 NPY and shot (公式+三分)
- hdu 5144 NPY and shot 物理+三分
- HDOJ 5144 NPY and shot
- hdu 5144 NPY and shot(三分)
- HDU 5144 NPY and shot(物理运动学+三分查找)
- BestCoder Round #22 03 NPY and shot(三分)
- hdu 5144 NPY and shot
- HDU 5144 NPY and shot(三分法)
- hdu 5144 NPY and shot(物理+三分法)
- NPY and shot (三分求峰值)
- NPY and shot(三分)
- 【CUGBACM15级BC第22场 C】hdu 5144 NPY and shot
- [HDU5144]NPY and shot 解题报告
- HDOJ 5142 NPY and FFT
- HDOJ 5143 NPY and arithmetic progression
- HDU5144 NPY and shot && BestCoder Round #22 1003
- HDU5144 NPY and shot