题意:给你一段弯弯曲曲的管子,问是否存在一条光线可以穿过整条管子,如果存在,则输出“Through all the pipe”,否则输出X轴正方向光线最远能到的X轴坐标。
思路:如果存在这样一束光线,则此束光线必过管子的两个节点。如果不存在,最远的那一丝光线也必过管子的两个的节点,所以剩下的任务就是无厘头的枚举了。
PS:我感觉我已经爱上熬夜了......
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <cmath> #include <algorithm> #include <string> #define LL long long #define Max(a,b) (a) > (b) ? (a) : (b) #define Min(a,b) (a) < (b) ? (a) : (b) #define EPS (1e-8) #define Left true #define Right false using namespace std; struct P { double x,y; }p[40][2]; double X_Mul(P a1,P a2,P b1, P b2) { P v1 = {a2.x-a1.x,a2.y-a1.y},v2 = {b2.x-b1.x,b2.y-b1.y}; return (v1.x*v2.y - v2.x*v1.y); } bool Is_Through(P p1,P p2,int n) { int i; for(i = 0;i < n; ++i) { if(X_Mul(p1,p2,p1,p[i][0]) < (-EPS)) return false; } for(i = 0;i < n; ++i) { if(X_Mul(p1,p2,p1,p[i][1]) > EPS) return false; } return true; } double Cal_Position(P a1,P a2,P b1,P b2) { double t = fabs(X_Mul(a1,a2,a1,b1))/fabs(X_Mul(a1,a2,b1,b2)); return b1.x + (b2.x - b1.x)*t; } double Cal_Len(P p1,P p2,int n,int s,int e) { int i; for(i = 0;i < s; ++i) { if(X_Mul(p1,p2,p1,p[i][0]) < (-EPS) || X_Mul(p1,p2,p1,p[i][1]) > EPS ) return p[0][0].x; //此时表明此光线不存在 } for(i = s+1;i < e; ++i) { if(X_Mul(p1,p2,p1,p[i][0]) < (-EPS) || X_Mul(p1,p2,p1,p[i][1]) > EPS ) return p[0][0].x; //此时表明此光线不存在 } for(i = e+1;i < n; ++i) { if(X_Mul(p1,p2,p1,p[i][0]) < EPS) { return Cal_Position(p1,p2,p[i-1][0],p[i][0]); } else if(X_Mul(p1,p2,p1,p[i][1]) > EPS ) { return Cal_Position(p1,p2,p[i-1][1],p[i][1]); } } return p[0][0].x; } void output(int n) { int i,j; for(i = 0;i < n; ++i) { for(j = i+1;j < n; ++j) { if(Is_Through(p[i][0],p[j][0],n) || Is_Through(p[i][1],p[j][0],n) || Is_Through(p[i][0],p[j][1],n)|| Is_Through(p[i][1],p[j][1],n)) { cout<<"Through all the pipe."<<endl; return ; } } } double Temp,Max = p[0][0].x; for(i = 0;i < n; ++i) { for(j = i+1;j < n; ++j) { Temp = Cal_Len(p[i][0],p[j][0],n,i,j); Max = Max(Temp,Max); Temp = Cal_Len(p[i][1],p[j][0],n,i,j); Max = Max(Temp,Max); Temp = Cal_Len(p[i][0],p[j][1],n,i,j); Max = Max(Temp,Max); Temp = Cal_Len(p[i][1],p[j][1],n,i,j); Max = Max(Temp,Max); } printf("%.2f\n",Max); return ; } int main() { int n,i; while(scanf("%d",&n) && n) { for(i = 0;i < n; ++i) { scanf("%lf %lf",&p[i][0].x,&p[i][0].y); p[i][1] = p[i][0]; p[i][1].y--; } output(n); } return 0; }