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