hdu 2438+hdu 3400(三分求极值)
2013-05-14 12:30
176 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2438
网上大牛思路:
可以根据边界,汽车已经转弯,设水平方向为x轴,垂直方向为y轴。
则汽车的内边界(靠近里面的边界)的直线方程式f(x)为:y=x*tan(a)+l*sin(a)+d/cos(a).其中a是汽车与x轴的夹角
当y=X时,求解出的-x即为汽车的内边界到y轴的距离h,若h小于Y即可转弯,若大于Y就不能转弯。
所以只需要利用方程式,求-x的最大值,即可判断能否通过。
由于f(x)是凸函数(随着x的增大y先增大后减小),所以,需要借助三分求解。
图示:
View Code
网上大牛思路:
可以根据边界,汽车已经转弯,设水平方向为x轴,垂直方向为y轴。
则汽车的内边界(靠近里面的边界)的直线方程式f(x)为:y=x*tan(a)+l*sin(a)+d/cos(a).其中a是汽车与x轴的夹角
当y=X时,求解出的-x即为汽车的内边界到y轴的距离h,若h小于Y即可转弯,若大于Y就不能转弯。
所以只需要利用方程式,求-x的最大值,即可判断能否通过。
由于f(x)是凸函数(随着x的增大y先增大后减小),所以,需要借助三分求解。
图示:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; #define eps 1e-7 #define MIN 1e-9 struct Point{ double x,y; }a,b,c,d,aa,dd; double ab,cd; double p,q,r; double dist(Point &a,Point &b){ //加eps,可能测试数据都是int类型开方有误差 return sqrt(eps+(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } double Solve(double t){ dd.x=d.x+(c.x-d.x)/cd*t*q; dd.y=d.y+(c.y-d.y)/cd*t*q; return t+dist(aa,dd)/r; } double SanFen(double t){ aa.x=a.x+(b.x-a.x)/ab*t*p; aa.y=a.y+(b.y-a.y)/ab*t*p; double low=0,high=cd/q,mid,mmid;//对cd进行三分 while(high-low>eps){ mid=(low+high)/2; mmid=(mid+high)/2; if(Solve(mid)<Solve(mmid))high=mmid+MIN; else low=mid-MIN; } return t+Solve(mid); } int main(){ int _case; scanf("%d",&_case); while(_case--){ scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y); scanf("%lf%lf%lf%lf",&c.x,&c.y,&d.x,&d.y); scanf("%lf%lf%lf",&p,&q,&r); ab=dist(a,b),cd=dist(c,d); double low=0,high=ab/p,mid,mmid;//对ab进行三分 while(high-low>eps){ mid=(low+high)/2; mmid=(mid+high)/2; if(SanFen(mid)<SanFen(mmid))high=mmid+MIN; else low=mid-MIN; } //最后通过ab上确定的那个点再在cd上进行三分求出最小值 printf("%.2lf\n",SanFen(mid)); } return 0; }
View Code
相关文章推荐
- hdu 2438+hdu 3400(三分求极值)
- HDU 2438 Turn the corner (三分求极值)
- HDU3400+三分
- hdu 2899 hdu 3400 三分/几何
- HDU 4355 Party All the Time (三分求凸函数极值)
- Line belt HDU - 3400 三分
- hdu 2899 三分查找求极值
- hdu 5027 Help!(计算几何 三分求极值)
- hdu-2438-Turn the corner(三分)
- HDU 3400 Line belt (三分嵌套)
- HDU 4355 Party All the Time (三分求极值)
- hdu 3400 Line belt 三分
- 三分求一元三次方程的极值:hdu 4355
- 【三分】hdu 3400
- hdu 3400 Line belt(多重三分)
- hdu 3400 Line belt 三分
- hdu 2438 计算几何 三分 Turn the corner
- HDU 3400 Line belt (三分套三分)
- (step4.1.3)hdu 2438(Turn the corner——三分查找)
- HDU 2438 Turn the corner(三分查找)