JZOJ 4692 傳送帶

題目大意

二維平面上有兩條線段,一條端點爲A,B,另一條端點是C,D,在分別兩條線段上和平面上都有不同的速度,求從A走到D花費的最短時間。

所有座標爲1~1000的整數
時間限制 1s
空間限制 256M

解題思路

三分套三分

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 10006
#define maxt 30006
#define fr(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const double eps=0.001;

double sqr(double x)
{
    return x*x;
}
double dist(double x,double y,double w,double v)
{
    return sqrt(sqr(x-w)+sqr(y-v));
}
int ax,ay,bx,by,cx,cy,dx,dy,p,q,rr;
double l,r,mid1,mid2,base1,base2,ans;
double make(double x,double y)
{
    double l=0,r=base2,mid1,mid2,w,v,s1,s2,s=1 << 30;
    while (r-l>eps)
    {
        mid1=l+(r-l)/3;
        mid2=r-(r-l)/3;

        w=cx+mid1/base2*(dx-cx),v=cy+mid1/base2*(dy-cy);
        s1=dist(x,y,w,v)/rr+dist(w,v,dx,dy)/q;

        w=cx+mid2/base2*(dx-cx),v=cy+mid2/base2*(dy-cy);
        s2=dist(x,y,w,v)/rr+dist(w,v,dx,dy)/q;

        s=min(s1,s2);
        if (s1<s2) r=mid2; else l=mid1;
    }
    return s;
}
int main()
{
    scanf("%d%d%d%d",&ax,&ay,&bx,&by);
    scanf("%d%d%d%d",&cx,&cy,&dx,&dy);
    scanf("%d%d%d",&p,&q,&rr);
    base1=dist(ax,ay,bx,by);
    base2=dist(cx,cy,dx,by);
    l=0,r=base1;
    while (r-l>eps)
    {
        mid1=l+(r-l)/3;
        mid2=r-(r-l)/3;

        double x,y,s1,s2;
        x=ax+mid1/base1*(bx-ax),y=ay+mid1/base1*(by-ay);
        s1=make(x,y)+dist(ax,ay,x,y)/p;

        x=ax+mid2/base1*(bx-ax),y=ay+mid2/base1*(by-ay);
        s2=make(x,y)+dist(ax,ay,x,y)/p;

        ans=min(s1,s2);
        if (s1>s2) l=mid1; else r=mid2;
    }
    printf("%.2f\n",ans);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章