概述:给你两条直线和走在两条直线上的速度,以及横穿两条直线的速度,让你求出从一条直线的下端,到另一条直线上端所需要的最短时间
思路:此题的本意是考察三分搜索,但是公式的确定也很重要。我们从一点开始,向上慢慢试即可。
感想:算法和数学的关系真的很大!!
#include<stdio.h>
#include<math.h>
double p,q,rr;
struct Point
{
double x,y;
};
double dis(Point A,Point B)
{
return sqrt((B.x-A.x)*(B.x-A.x)+(B.y-A.y)*(B.y-A.y));
}
double calc(Point x,Point C,Point D)
{
Point l=C,r=D,mid,midmid;
double mid_area,midmid_area;
do//Three the length of the CD
{
mid.x=(l.x+r.x)/2;mid.y=(l.y+r.y)/2;
midmid.x=(mid.x+r.x)/2;midmid.y=(mid.y+r.y)/2;
mid_area=dis(mid,D)/q+dis(x,mid)/rr;
midmid_area=dis(midmid,D)/q+dis(x,midmid)/rr;
if(mid_area>midmid_area)l=mid;
else r=midmid;
}while(dis(l,r)>=1e-9);
return mid_area;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
Point A,B,C,D;
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y,&C.x,&C.y,&D.x,&D.y);
scanf("%lf%lf%lf",&p,&q,&rr);
Point l=A,r=B,mid,midmid;
double mid_area,midmid_area;
do//Three the length of the AB
{
mid.x=(r.x+l.x)/2;mid.y=(r.y+l.y)/2;
midmid.x=(r.x+mid.x)/2;midmid.y=(r.y+mid.y)/2;
mid_area=dis(A,mid)/p+calc(mid,C,D);
midmid_area=dis(A,midmid)/p+calc(midmid,C,D);
if(mid_area<midmid_area)r=midmid;
else l=mid;
}while(dis(l,r)>=1e-9);
printf("%.2lf\n",mid_area);
}
return 0;
}
2594

被折叠的 条评论
为什么被折叠?



