#include  <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <iomanip>
#include <cassert>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <list>
#include <map>
#include <set>
using namespace std;
const int maxn=;
const double eps=1e-;
int sgn(double x){ if(fabs(x) < eps) return ; if(x >) return ; return -; }
int dcmp(double x, double y){ if(fabs(x - y) < eps) return ; if(x > y) return ;return -;}
struct Point { double x,y; Point(double x,double y) { x=x;y=y; }; Point() {}; };
struct Segment{ Point a,b; Segment(Point x,Point y ) { a=x;b=y; }; Segment(){}; };
struct Line { Point a,b; Line(Point x,Point y ) { a=x;b=y; }; Line(){}; };
typedef Point Vector;
/*Vector operator + (Vector A, Vector B){ return Vector(A.x+B.x, A.y+B.y); } // 向量相加
Vector operator - (Point A, Point B){ return Vector(B.x-A.x, B.y-A.y); } // 向量生成 A-B;
double operator * (Vector A, Vector B){ return A.x*B.x-A.y*B.y; } // 点积
double operator ^ (Vector A, Vector B){ return A.x*B.y-A.y*B.x; } // 叉积*/
double Dot(Vector A, Vector B) { return A.x*B.x + A.y*B.y; } // 点积
double Cross(Vector A, Vector B) { return A.x*B.y-A.y*B.x; } // 叉积
double Length(Vector A) { return sqrt(Dot(A, A)); } // 向量长度
double dis(Point a,Point b) { return sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) ); }
Point pa[maxn];
Point pb[maxn];
Line sg[maxn];
int n;
double make(Line A,Line B)
{
Point a=A.a; Point b=A.b;Point c=B.a; Point d=B.b;
double A1=b.y-a.y,B1=-(b.x-a.x),C1=b.y*a.x-b.x*a.y;
double A2=d.y-c.y,B2=-(d.x-c.x),C2=d.y*c.x-d.x*c.y;
double k=A1*B2-A2*B1;
double x=-(B1*C2-C1*B2)*1.000000000/k;
double y=(A1*C2-C1*A2)*1.00000000/k;
return x;
}
bool co(Line A,Line B)
{
Point a=A.a; Point b=A.b; Point c=B.a; Point d=B.b;
Vector x,y,xxx,yyy;
x.x=c.x-a.x; x.y=c.y-a.y;
y.x=d.x-a.x; y.y=d.y-a.y;
xxx.x=c.x-b.x; xxx.y=c.y-b.y;
yyy.x=d.x-b.x; yyy.y=d.y-b.y;
if( Cross(x,y)*Cross(xxx,yyy)>eps ) return ;
else return ;
}
double work(Point xx,Point yy)
{
Line qq; qq.a=xx; qq.b=yy; //cout<<xx.x<<" "<<xx.y<<endl;
//cout<<yy.x<<" "<<yy.x<<endl; double ans=-1e18;
for(int i=;i<=n;i++)
{ if(i==)
{
if(co(sg[i],qq)==) return ans;
}
else
{
if(co(sg[i],qq)==) ans=max(ans,make(sg[i],qq));
else
{
if(co(Line(pa[i],pa[i-]),qq)==) ans=max(ans,make(Line(pa[i],pa[i-]),qq));
if(co(Line(pb[i],pb[i-]),qq)==) ans=max(ans,make(Line(pb[i],pb[i-]),qq));
break;
}
}
}
return ans;
}
bool up(Point a,Point b)
{
return a.x<b.x;
}
int main()
{
while()
{
scanf("%d",&n); if(n==) { break; }
for(int i=;i<=n;i++) { scanf("%lf %lf",&pa[i].x,&pa[i].y); } // xia mian dian
sort(pa+,pa++n,up);
for(int i=;i<=n;i++) { pb[i].x=pa[i].x; pb[i].y=pa[i].y+1.0; } // shang mian dian
for(int i=;i<=n;i++) { pa[i].y--; pb[i].y--; } // 下移
for(int i=;i<=n;i++) { sg[i].a=pa[i]; sg[i].b=pb[i]; } // a xiao b shang
double ans=-1e18;
for(int i=;i<=n;i++)
{
for(int j=i+;j<=n;j++) // end
{
ans=max(ans,work(pa[i],pa[j]));
ans=max(ans,work(pa[i],pb[j]));
ans=max(ans,work(pb[i],pa[j]));
ans=max(ans,work(pb[i],pb[j]));
}
//cout<<ans<<endl;
}
if(fabs(ans-pa[n].x)>eps ) printf("%.2f\n",ans);
else printf("Through all the pipe.\n");
}
return ;
}

poj 1039的更多相关文章

  1. poj 1039 Pipe(叉乘。。。)

    题目:http://poj.org/problem?id=1039 题意:有一宽度为1的折线管道,上面顶点为(xi,yi),所对应的下面顶点为(xi,yi-1),假设管道都是不透明的,不反射的,光线从 ...

  2. POJ - 1039 Pipe(计算几何)

    http://poj.org/problem?id=1039 题意 有一宽度为1的折线管道,上面顶点为(xi,yi),所对应的下面顶点为(xi,yi-1),假设管道都是不透明的,不反射的,光线从左边入 ...

  3. POJ 1039 Pipe【经典线段与直线相交】

    链接: http://poj.org/problem?id=1039 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ...

  4. poj 1039 Pipe (Geometry)

    1039 -- Pipe 理解错题意一个晚上._(:з」∠)_ 题意很容易看懂,就是要求你求出从外面射进一根管子的射线,最远可以射到哪里. 正解的做法是,选择上点和下点各一个,然后对于每个折点位置竖直 ...

  5. nyoj 142, poj 1039 ,hdu 1454 管道问题

    http://acm.nyist.net/JudgeOnline/problem.php?pid=142 第一道解析几何问题,比较纠结,主要是几个解析几何的基本操作,包括求两线段的叉积,判断左右方向, ...

  6. 简单几何(直线与线段相交) POJ 1039 Pipe

    题目传送门 题意:一根管道,有光源从入口发射,问光源最远到达的地方. 分析:黑书上的例题,解法是枚举任意的一个上顶点和一个下顶点(优化后),组成直线,如果直线与所有竖直线段有交点,则表示能穿过管道. ...

  7. POJ 1039问题描述

    Description The GX Light Pipeline Company started to prepare bent pipes for the new transgalactic li ...

  8. POJ 1039 Pipe(直线和线段相交判断,求交点)

    Pipe Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8280   Accepted: 2483 Description ...

  9. POJ 1039 Pipe

    题意:一根管子,中间有一些拐点,给出拐点的上坐标,下坐标为上坐标的纵坐标减1,管子不能透过光线也不能折射光线,问光线能射到最远的点的横坐标. 解法:光线射到最远处的时候一定最少经过两个拐点,枚举每两个 ...

  10. poj 1039 Pipe(几何基础)

    Pipe Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9932   Accepted: 3045 Description ...

随机推荐

  1. Tomcat各个版本下载路径

    http://archive.apache.org/dist/tomcat/tomcat-7/     修改对应版本号即可比如 tomcat-8

  2. 一条命令关掉centos所有不必要的服务和端口号

    centos作为服务器开放的服务多了,难免一些服务软件有漏洞,开放的端口号越多,上线的服务器越危险,所以我们必须在服务器上线之前把centos里面不必要的服务全部干掉,不让坏人有可乘之机. 首先看一下 ...

  3. 并查集(POJ1182)

    链接:http://poj.org/problem?id=1182 定义一种关系R(x,y),x > y 时 R(x,y) = 2:x = y 时 R(x,y)= 1:x < y 时 R( ...

  4. 使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

    java项目结构如下: Demo是模仿程序快照,主要设计两个按钮:保存快照和恢复快照: 保存快照将对象(窗口)序列化保存下来,后面无论做了什么操作,只要点击恢复快照, 就会读取之前保存的序列化的对象. ...

  5. linux c TCP连接通讯

    服务端: 1.申请服务端自己的socket 2.对addr赋值 3.bind文件描述符和地址信息 4.listen监听服务 5.等待accept客户端的连接 6.处理建立好的连接 7.关闭socket ...

  6. lunx中部分命令总结

    一.文件和目录操作命令ls  全拼list,功能是列出目录的内容及其内容属性信息. cd  全拼change directory,功能是从当前工作目录切换到指定的工作目录. cp  全拼copy,其功 ...

  7. SoapUI并发模式

    soapUI支持test suite, test case级别的并发,合理使用这个功能,可以让自动化脚本短时间内跑完,为release省下时间. 1. 如何开启并发模式 图示,click projec ...

  8. 零基础学习JavaSE(二)——基础语法

    二.Java 基础语法 2.1 Java 基础语法 java是一个面向对象的程序语言,及可把一切事物当做对象处理,而java的事物中最小的就是class (类),类中有方法,类可以创建对象,并且有一些 ...

  9. flask记录

    flask文件上传 flask 文件上传  https://www.cnblogs.com/wongbingming/p/6802660.html flask多文件上传:https://blog.cs ...

  10. spring-data-mongodb与mongo shell的对应关系

    除了特殊注释外,本文的测试结果均基于 spring-data-mongodb:1.10.6.RELEASE(spring-boot-starter:1.5.6.RELEASE),MongoDB 3.0 ...