题意:

题意很好理解,从左边射过来的光线,最远能经过管道到右边多少距离。

分析:

光线一定经过一个上端点和一个下端点,这一点很容易想到。然后枚举上下端点即可

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define eps 1e-8
#define INF 1e9
#define OK sgn(tmp-lx1)>0 && sgn(tmp-lx2<0)
using namespace std; typedef struct Point
{
double x,y;
Point() {};
Point(double xx,double yy)
{
x=xx;
y=yy;
}
} Vector; struct Line
{
Point p,q;
Line() {};
Line(Point pp,Point qq)
{
p=pp;
q=qq;
}
}; int sgn(double x)
{
if(fabs(x)<eps) return 0;
return x<0? -1:1;
} double crs_prdct(Vector a,Vector b)
{
return a.x*b.y-b.x*a.y;
} Vector operator - (Point a,Point b)
{
return Vector(a.x-b.x,a.y-b.y);
} double cross_x(Point p1,Point p2,Point p3,Point p4)
{
double k1=(p1.y-p2.y)/(p1.x-p2.x);
double k2=(p3.y-p4.y)/(p3.x-p4.x);
return (k1*p1.x-k2*p3.x-p1.y+p3.y)/(k1-k2);
} double get_y(Point p,Point q,double x)
{
return (p.y-q.y)/(p.x-q.x)*(x-p.x)+p.y;
} //判断直线和线段相交
bool Seg_inter_line(Line l1,Line l2) //判断直线l1和线段l2是否相交,<0是把交于线段端点处看做不相交
{
return sgn(crs_prdct(l2.p-l1.q,l1.p-l1.q))*sgn(crs_prdct(l2.q-l1.q,l1.p-l1.q)) < 0;
} const int maxn=30;
Point Up[maxn],Dw[maxn]; int main()
{
// freopen("in.txt","r",stdin);
int n;
while(scanf("%d",&n),n)
{
double x,y;
for(int i=0; i<n; i++)
{
scanf("%lf%lf",&x,&y);
Up[i]=Point(x,y);
Dw[i]=Point(x,y-1);
}
double ans=Up[0].x;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(i==j) continue;
for(int k=0; k<n-1; k++)
{
if(Seg_inter_line(Line(Up[i],Dw[j]),Line(Up[k],Up[k+1])))
{
ans=max(ans,cross_x(Up[i],Dw[j],Up[k],Up[k+1]));
break;
}
if(Seg_inter_line(Line(Up[i],Dw[j]),Line(Dw[k],Dw[k+1])))
{
ans=max(ans,cross_x(Up[i],Dw[j],Dw[k],Dw[k+1]));
break;
}
double t=get_y(Up[i],Dw[j],(Up[k].x+Up[k+1].x)/2);
if(t>(Up[k].y+Up[k+1].y)/2 || t<(Dw[k].y+Dw[k+1].y)/2)
{
ans=max(ans,Up[k].x);
break;
}
if(k==n-2) ans=Up[n-1].x;
}
}
}
if(sgn(ans-Up[n-1].x)==0) printf("Through all the pipe.\n");
else printf("%.2f\n",ans);
}
return 0;
}

POJ 1039 直线和线段相交的更多相关文章

  1. poj 3304(直线与线段相交)

    传送门:Segments 题意:线段在一个直线上的摄影相交 求求是否存在一条直线,使所有线段到这条直线的投影至少有一个交点 分析:可以在共同投影处作原直线的垂线,则该垂线与所有线段都相交<==& ...

  2. POJ 1039 Pipe 枚举线段相交

    Pipe Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9493   Accepted: 2877 Description ...

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

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

  4. 判断直线与线段相交 POJ 3304 Segments

    题意:在二维平面中,给定一些线段,然后判断在某直线上的投影是否有公共点. 转化,既然是投影,那么就是求是否存在一条直线L和所有的线段都相交. 证明: 下面给出具体的分析:先考虑一个特殊的情况,即n=1 ...

  5. hdu 3304(直线与线段相交)

    Segments Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12042   Accepted: 3808 Descrip ...

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

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

  7. POJ 3304 Segments(计算几何:直线与线段相交)

    POJ 3304 Segments 大意:给你一些线段,找出一条直线可以穿过全部的线段,相交包含端点. 思路:遍历全部的端点,取两个点形成直线,推断直线是否与全部线段相交,假设存在这种直线,输出Yes ...

  8. POJ 3304 Segments 判断直线和线段相交

    POJ 3304  Segments 题意:给定n(n<=100)条线段,问你是否存在这样的一条直线,使得所有线段投影下去后,至少都有一个交点. 思路:对于投影在所求直线上面的相交阴影,我们可以 ...

  9. POJ 3304 Segments (判断直线与线段相交)

    题目链接:POJ 3304 Problem Description Given n segments in the two dimensional space, write a program, wh ...

随机推荐

  1. 【转载】geany linux python编译器 开源

    http://www.dekiru.cn/?p=1491 Geany 不好用,建议用一些好用的编辑器或ide Subliem Text 或 VS code Pycharm等. 设置运行环境 菜单栏–生 ...

  2. 攻防世界(八)web2

    攻防世界系列:web2 1.代码审计  知识补充: strrev(string):反转字符串 strlen(string):字符串长度 substr(string,start,length):截取字符 ...

  3. dd命令详解-(转自dkcndk)

    Linux-dd命令详解 dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换.名称: dd 使用权限: 所有使用者dd 这个指令在 ...

  4. 最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析

    最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析 最小生成树,老生常谈了,生活中也总会有各种各样的问题,在这里,我来带你一起分析一下这个算法的思路与实现的方式吧~~ 在考研中呢 ...

  5. Go以及调试工具dlv安装及使用

    安装go wget https://studygolang.com/dl/golang/go1.14.1.linux-amd64.tar.gz tar -C /usr/local -zxvf go1. ...

  6. EVE-NG 入门教程 (Mac OSX BIg Sur)

    EVE-NG 入门搭建指南 1. 什么是 EVE-NG EVE-NG (Emulate d Virtual Environment) 是一个可以运行虚拟主机.网络设备的模拟器,目前该软件分为了社区版. ...

  7. Java List去重以及效率分析

    List去重无非几种方法: 下面文章提供的两种: https://blog.csdn.net/u012156163/article/details/78338574, 以及使用List.stream. ...

  8. Python+Selenium自动化-定位页面元素的八种方法

    Python+Selenium自动化-定位页面元素的八种方法   本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子. 0.元素定位方法主要有: id定位:find_elemen ...

  9. 自动机器学习(AutoML)

    自动机器学习(AutoML) 不再需要苦恼于学习各种机器学习的算法 目录: 一.为什么需要自动机器学习 二.超参数优化 Hyper-parameter Optimization 三.元学习 Meta ...

  10. 深度学习加速器堆栈Deep Learning Accelerator Stack

    深度学习加速器堆栈Deep Learning Accelerator Stack 通用张量加速器(VTA)是一种开放的.通用的.可定制的深度学习加速器,具有完整的基于TVM的编译器堆栈.设计了VTA来 ...