poj 1039 Pipe(叉乘。。。)
题目:http://poj.org/problem?id=1039
题意:有一宽度为1的折线管道,上面顶点为(xi,yi),所对应的下面顶点为(xi,yi-1),假设管道都是不透明的,不反射的,光线从左边入口处的(x1,y1),(x1,y1-1)之间射入,向四面八方传播,求解光线最远能传播到哪里(取x坐标)或者是否能穿透整个管道.
思路:最优的是 光线过一个上顶点,一个下顶点。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<iomanip>
using namespace std;
const double eps=1e-;
const int INF=<<;
int n; struct point
{
double x,y;
}up[],down[]; int dblcmp(double x)
{
if(x<-eps) return -;//一定要注意精度问题,不然样例都过不了
if(x>eps) return ;
return ; //在这里把接近0的数值都看成了0,实际这些数值就是0
} double det(double x1,double y1,double x2,double y2)// 向量坐标点的叉乘
{
return x1*y2-x2*y1;
}
double cross(point a,point b,point c)//ab和ac向量的叉乘
{
return det(b.x-a.x,b.y-a.y,c.x-a.x,c.y-a.y);
} double getx(point a,point b,point c,point d)//求ab和cd组成的直线交点的横坐标。
{
double b1,b2,k1,k2;
k1=(b.y-a.y)/(b.x-a.x);
k2=(d.y-c.y)/(d.x-c.x);
b1=a.y-k1*a.x;
b2=c.y-k2*c.x;
return (b2-b1)/(k1-k2);
}
void solve()
{
int i,j,k;
double ans=-INF,cnt;
for(i=; i<n; i++)
{
for(j=; j<n; j++)
{
if(i==j) continue; //同一个横坐标的跳过
for(k=; k<n; k++)
{
if(dblcmp(cross(up[i],down[j],up[k]))*dblcmp(cross(up[i],down[j],down[k]))>)
break;//叉乘大于0说明 这条直线在两个点的同一侧,从叉乘的定义可以看出|a||b|sin&;
}
if(k<max(i,j)) continue; //如果这样的话 说明光线不存在。。。
cnt=getx(up[i],down[j],up[k],up[k-]);//找上顶点线的交点
if(cnt>ans) ans=cnt;
cnt=getx(up[i],down[j],down[k],down[k-]);//找下顶点线的交点
if(cnt>ans) ans=cnt;
if(k==n)
{
cout<<"Through all the pipe."<<endl;
return;
}
}
}
cout<<fixed<<setprecision()<<ans<<endl;
}
int main()
{
int i;
while(~scanf("%d",&n)&&n)
{
for(i=; i<n; i++)
{
cin>>up[i].x; cin>>up[i].y;
down[i].x=up[i].x; down[i].y=up[i].y-1.0;
}
solve();
}
return ;
}
poj 1039 Pipe(叉乘。。。)的更多相关文章
- poj 1039 Pipe (Geometry)
1039 -- Pipe 理解错题意一个晚上._(:з」∠)_ 题意很容易看懂,就是要求你求出从外面射进一根管子的射线,最远可以射到哪里. 正解的做法是,选择上点和下点各一个,然后对于每个折点位置竖直 ...
- 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
题目传送门 题意:一根管道,有光源从入口发射,问光源最远到达的地方. 分析:黑书上的例题,解法是枚举任意的一个上顶点和一个下顶点(优化后),组成直线,如果直线与所有竖直线段有交点,则表示能穿过管道. ...
- 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 ...
- POJ 1039 Pipe 枚举线段相交
Pipe Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9493 Accepted: 2877 Description ...
- POJ 1039 Pipe | 线段相交
题目: 给一个管子,有很多转弯处,问从管口的射线射进去最长能射到多远 题解: 根据黑书,可以证明的是这条光线一定经过了一个上顶点和下顶点 所以我们枚举每对上下顶点就可以了 #include<cs ...
随机推荐
- mongodb下如何开启不同端口,本地远程ip的服务器呢
mongod --bind_ip 10.0.10.27 --port 28000 像这样可以绑定ip,绑定地址
- webpack减少打包后文件体积的几种方法
webpack 把我们所有的文件都打包成一个 JS 文件,这样即使你是小项目,打包后的文件也会非常大.下面就来讲下如何从多个方面进行优化. 去除不必要的插件 刚开始用 webpack 的时候,开发环境 ...
- T-SQL实例 函数结果设置为列别名
本文分享一个T-SQL的例子,将自定义函数的结果作为别名列,是个不错的应用实例,有兴趣的朋友研究下. T-SQL实例,学习下将函数结果作为别名列的方法. 代码: view source print? ...
- 深入理解jsavascript的作用域
一. JavaScript声明提前 在JavaScript中如果不创建变量,直接去使用,则报错: console.log(xxoo); // 报错:Uncaught ReferenceError: x ...
- Python 信号量
信号的概念 信号(signal)-- 进程之间通讯的方式,是一种软件中断.一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号. 几个常用信号: SIGINT 终止进程 中断进 ...
- Sqoop 1.99.4 安装
1.安装准备工作:已经装好的 hadoop 环境是 hadoop-2.5.1 64位下载的sqoop安装包(注意是hadoop200)http://www.us.apache.org/dist/sqo ...
- 2016 系统设计第一期 (档案一)MVC 引用 js css
@Styles.Render("~/Bootstrap/css/bootstrap-theme.css") @Scripts.Render("~/jQuery/jquer ...
- 【BZOJ 1798】 [Ahoi2009]Seq 维护序列seq
Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
- python学习笔记17(动态类型)
动态类型 在我们接触的对象中,有一类特殊的对象,是用于存储数据的,常见的该类对象包括各种数字,字符串,表,词典.在C语言中,我们称这样一些数据结构为变量,而在Python中,这些是对象. 对象是储存在 ...
- C#线程同步总结
对于整数数据类型的简单操作,可以用Interlocked类的成员来实现线程同步.对于复杂的线程同步,有以下几个方法: 1.lock关键字: 2.Monitor: 3.同步事件和等待句柄: 4.Mute ...