POJ 1039 Pipe

来源:互联网 发布:config.php下载 编辑:程序博客网 时间:2024/05/01 01:15

题意:一束光线从左端射入钢管,问能到达的最远点的横坐标。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <queue>using namespace std;const double INF = 1e20;const double EPS = 1e-6;struct cvector{    double x,y;    cvector(double a,double b)    {        x=a,y=b;    }    cvector() {}};cvector operator+(cvector a,cvector b){    return cvector(a.x+b.x,a.y+b.y);}cvector operator-(cvector a,cvector b){    return cvector(a.x-b.x,a.y-b.y);}cvector operator*(double a,cvector b){    return cvector(a*b.x,a*b.y);}double operator*(cvector a,cvector b){    return a.x*b.x+a.y*b.y;}double operator^(cvector a,cvector b){    return a.x*b.y-b.x*a.y;}double length(double t){    return t<0?-1:t;}double length(cvector t){    return sqrt(t*t);}struct cpoint{    double x,y;    cpoint(double a,double b)    {        x=a,y=b;    }    cpoint() {}};cvector operator-(cpoint a,cpoint b){    return cvector(a.x-b.x,a.y-b.y);}double dist(cpoint a,cpoint b){    return length(a-b);}struct cline{    cpoint a,b;};bool intersect(cline a,cline b){    return ((a.a-b.a)^(b.b-b.a))*((a.b-b.a)^(b.b-b.a))<EPS;}cpoint intersection(cline u, cline v){    cpoint ret=u.a;    double t=((u.a.x-v.a.x)*(v.a.y-v.b.y)-(u.a.y-v.a.y)*(v.a.x-v.b.x))/             ((u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x));    ret.x+=(u.b.x-u.a.x)*t;    ret.y+=(u.b.y-u.a.y)*t;    return ret;}cline re[29];cline edge[29][2];int n;double oper(cline tmp){    if(!intersect(re[0],tmp))return -INF;    double ans = -INF;    int k;    for(k=1; k<n; k++)        if(!intersect(re[k],tmp))        {            cpoint x;            x = intersection(edge[k][0],tmp);            ans = max(ans,x.x);            x = intersection(edge[k][1],tmp);            ans = max(ans,x.x);            break;        }    if(k>=n)return INF;    return ans;}int main(){    freopen("in.txt","r",stdin);    while(scanf("%d",&n)&&n)    {        double ans = -INF;        for(int i=0; i<n; i++)        {            scanf("%lf%lf",&re[i].a.x,&re[i].a.y);            re[i].b.x=re[i].a.x;            re[i].b.y=re[i].a.y-1;            if(i)            {                edge[i][0].a=re[i].a;                edge[i][0].b=re[i-1].a;                edge[i][1].a=re[i].b;                edge[i][1].b=re[i-1].b;            }        }        cline tmp;        for(int i=0; i<n&&ans!=INF; i++)        {            for(int j=i+1; j<n&&ans!=INF; j++)            {                tmp.a=re[i].a,tmp.b=re[j].a;                ans = max(ans,oper(tmp));                tmp.a=re[i].b,tmp.b=re[j].b;                ans = max(ans,oper(tmp));                tmp.a=re[i].b,tmp.b=re[j].a;                ans = max(ans,oper(tmp));                tmp.a=re[i].a,tmp.b=re[j].b;                ans = max(ans,oper(tmp));            }        }        if(ans==INF) printf("Through all the pipe.\n");        else printf("%.2lf\n",ans);    }    return 0;}