poj 1039
#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的更多相关文章
- poj 1039 Pipe(叉乘。。。)
题目:http://poj.org/problem?id=1039 题意:有一宽度为1的折线管道,上面顶点为(xi,yi),所对应的下面顶点为(xi,yi-1),假设管道都是不透明的,不反射的,光线从 ...
- POJ - 1039 Pipe(计算几何)
http://poj.org/problem?id=1039 题意 有一宽度为1的折线管道,上面顶点为(xi,yi),所对应的下面顶点为(xi,yi-1),假设管道都是不透明的,不反射的,光线从左边入 ...
- POJ 1039 Pipe【经典线段与直线相交】
链接: http://poj.org/problem?id=1039 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ...
- poj 1039 Pipe (Geometry)
1039 -- Pipe 理解错题意一个晚上._(:з」∠)_ 题意很容易看懂,就是要求你求出从外面射进一根管子的射线,最远可以射到哪里. 正解的做法是,选择上点和下点各一个,然后对于每个折点位置竖直 ...
- nyoj 142, poj 1039 ,hdu 1454 管道问题
http://acm.nyist.net/JudgeOnline/problem.php?pid=142 第一道解析几何问题,比较纠结,主要是几个解析几何的基本操作,包括求两线段的叉积,判断左右方向, ...
- 简单几何(直线与线段相交) POJ 1039 Pipe
题目传送门 题意:一根管道,有光源从入口发射,问光源最远到达的地方. 分析:黑书上的例题,解法是枚举任意的一个上顶点和一个下顶点(优化后),组成直线,如果直线与所有竖直线段有交点,则表示能穿过管道. ...
- POJ 1039问题描述
Description The GX Light Pipeline Company started to prepare bent pipes for the new transgalactic li ...
- POJ 1039 Pipe(直线和线段相交判断,求交点)
Pipe Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8280 Accepted: 2483 Description ...
- POJ 1039 Pipe
题意:一根管子,中间有一些拐点,给出拐点的上坐标,下坐标为上坐标的纵坐标减1,管子不能透过光线也不能折射光线,问光线能射到最远的点的横坐标. 解法:光线射到最远处的时候一定最少经过两个拐点,枚举每两个 ...
- poj 1039 Pipe(几何基础)
Pipe Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9932 Accepted: 3045 Description ...
随机推荐
- Tomcat各个版本下载路径
http://archive.apache.org/dist/tomcat/tomcat-7/ 修改对应版本号即可比如 tomcat-8
- 一条命令关掉centos所有不必要的服务和端口号
centos作为服务器开放的服务多了,难免一些服务软件有漏洞,开放的端口号越多,上线的服务器越危险,所以我们必须在服务器上线之前把centos里面不必要的服务全部干掉,不让坏人有可乘之机. 首先看一下 ...
- 并查集(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( ...
- 使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序
java项目结构如下: Demo是模仿程序快照,主要设计两个按钮:保存快照和恢复快照: 保存快照将对象(窗口)序列化保存下来,后面无论做了什么操作,只要点击恢复快照, 就会读取之前保存的序列化的对象. ...
- linux c TCP连接通讯
服务端: 1.申请服务端自己的socket 2.对addr赋值 3.bind文件描述符和地址信息 4.listen监听服务 5.等待accept客户端的连接 6.处理建立好的连接 7.关闭socket ...
- lunx中部分命令总结
一.文件和目录操作命令ls 全拼list,功能是列出目录的内容及其内容属性信息. cd 全拼change directory,功能是从当前工作目录切换到指定的工作目录. cp 全拼copy,其功 ...
- SoapUI并发模式
soapUI支持test suite, test case级别的并发,合理使用这个功能,可以让自动化脚本短时间内跑完,为release省下时间. 1. 如何开启并发模式 图示,click projec ...
- 零基础学习JavaSE(二)——基础语法
二.Java 基础语法 2.1 Java 基础语法 java是一个面向对象的程序语言,及可把一切事物当做对象处理,而java的事物中最小的就是class (类),类中有方法,类可以创建对象,并且有一些 ...
- flask记录
flask文件上传 flask 文件上传 https://www.cnblogs.com/wongbingming/p/6802660.html flask多文件上传:https://blog.cs ...
- spring-data-mongodb与mongo shell的对应关系
除了特殊注释外,本文的测试结果均基于 spring-data-mongodb:1.10.6.RELEASE(spring-boot-starter:1.5.6.RELEASE),MongoDB 3.0 ...