题意:一束光线从左端射入钢管,问能到达的最远点的横坐标。
#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;
}