POJ_1039

比较容易理解,如果光线最优的话是可以认为至少与某两个点相切的,因为如果不和某两个点相切,我们可以将光线进行平移和旋转使其至少和某两个点相切,而且结果不会变差。

于是我们可以枚举任意两个顶点确定一条直线作为光线的路径,之后只要看这条光线最多能够射多远即可。一个可行的思路就是首先判定这两个顶点及以前的光线是否在管子内,如果在管子内,再依次去判定光线最远能射到哪里。判定光线是否在管子内可以判定光线与每对顶点的纵截面的交点是否在管子内。

#include<stdio.h>#include<string.h>#define MAXD 50#define zero 1e-8int N;double x[MAXD], y[MAXD], ans;double fabs(double x){return x < 0 ? -x : x;}int dcmp(double x){if(fabs(x) < zero)return 0;if(x < 0)return -1;return 1;}void init(){int i, j, k;for(i = 0; i < N; i ++)        scanf("%lf%lf", &x[i], &y[i]);for(i = N; i < 2 * N; i ++)        x[i] = x[i - N], y[i] = y[i - N] - 1;}double det(double x1, double y1, double x2, double y2){return x1 * y2 - x2 * y1;}double getx(double x1, double x2, double t1, double t2){return (fabs(t2) * x1 + fabs(t1) * x2) / (fabs(t1) + fabs(t2));}double calculate(int k1, int k2){int i, j, k;double x1, x2, y1, y2, t = 0, t1, t2;if(x[k1] > x[k2])        k = k1, k1 = k2, k2 = k;    x1 = x[k1], y1 = y[k1], x2 = x[k2], y2 = y[k2];if(k2 > N)        k2 -= N;for(i = 0; i < k2; i ++)    {        t1 = det(x2 - x1, y2 - y1, x[i] - x1, y[i] - y1);        t2 = det(x2 - x1, y2 - y1, x[i] - x1, y[i] - 1 - y1);if(dcmp(t1) * dcmp(t2) > 0)return x[1];    }    t = x2;for(i = k2 + 1; i < N; i ++)    {        t1 = det(x2 - x1, y2 - y1, x[i - 1] - x1, y[i - 1] - y1);        t2 = det(x2 - x1, y2 - y1, x[i] - x1, y[i] - y1);if(dcmp(t1) * dcmp(t2) < 0)return t = getx(x[i - 1], x[i], t1, t2);        t1 = det(x2 - x1, y2 - y1, x[i - 1] - x1, y[i - 1] - 1 - y1);        t2 = det(x2 - x1, y2 - y1, x[i] - x1, y[i] - 1 - y1);if(dcmp(t1) * dcmp(t2) < 0)return t = getx(x[i - 1], x[i], t1, t2);        t1 = det(x2 - x1, y2 - y1, x[i] - x1, y[i] - y1);if(dcmp(t1) * dcmp(t2) > 0)return t;        t = x[i];    }return t;}void solve(){int i, j, k;double t;    ans = x[1];for(i = 0; i < 2 * N; i ++)for(j = i + 1; j < 2 * N; j ++)if(j != i + N)            {                t = calculate(i, j);if(t > ans)                    ans = t;            }if(dcmp(ans - x[N - 1]) >= 0)        printf("Through all the pipe.\n");else        printf("%.2lf\n", ans);}int main(){for(;;)    {        scanf("%d", &N);if(!N)break;        init();        solve();    }return 0;}

转载于:https://www.cnblogs.com/staginner/archive/2012/02/13/2348613.html

POJ 1039 Pipe相关推荐

  1. poj 1039 Pipe (判断 直线和 线段 是否相交 并 求交点)

    http://poj.org/problem?id=1039 题意:已知电缆是由一段段直的管道连接而成的,并知道这些管道的位置,问一束光从最左边射进来,你可以调节光入射的位置和角度,问最远能射到多远. ...

  2. POJ 计算几何入门题目推荐

      其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途(例如本人的专 ...

  3. [Z]POJ 计算几何入门题目推荐[转PKKJ]

    http://www.cnblogs.com/eric-blog/archive/2011/05/31/2064785.html http://hi.baidu.com/novosbirsk/blog ...

  4. poj计算几何题推荐

    POJ 计算几何入门题目推荐(转)       其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的 ...

  5. poj 计算几何 分类

    转自novosbirsk的空间,上面还有很多有用的东西. 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组 ...

  6. POJ 计算几何入门题目推荐(转)

    POJ 计算几何入门题目推荐(转)       其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的 ...

  7. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

  8. ACM计算几何题目推荐

    //第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...

  9. 算法学习经典例题整理

    陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...

最新文章

  1. 二叉树的遍历(递归与非递归)
  2. Quart 2D 绘制图形简单总结
  3. Singleton(单例模式)
  4. ncre计算机二级教程版本,计算机二级 NCRE教程word.pdf
  5. 浅谈windows句柄表
  6. 2021年下软考各省防控要求汇总
  7. 【问链-链改进行时】 第二课 链改的技术架构选择
  8. 索引使用的好处与坏处(Oracle测试)
  9. 3分钟tips:什么是特征向量?什么是特征值?
  10. 如何在 HTML5 页面中嵌入音频?如何在 HTML5 页面中嵌入视频?
  11. 烽烟通讯2100万限售股将于3月7日疏通流畅上市
  12. 在Xen的DomU中安装MySQL
  13. Junit 4 与Junit 5区别
  14. [人工智能-综述-3]:人工智能与硅基生命,人类终将成为造物主
  15. 破解受限制的XLSM文档
  16. 如何预防钓鱼邮件?S/MIME邮件证书来支招
  17. jquery.fly.js实现添加购物车效果、实现抛物线运动
  18. android横屏竖屏设置
  19. Surf函数调节图像方法
  20. 运维日常之机房浪潮服务器硬盘红灯亮起,服务器一直响,raid磁盘红色。。。故障解决方法...

热门文章

  1. 【Web安全】DVWA之Command injection(命令执行漏洞)探索
  2. Android移动开发之【Android实战项目】DAY15-翻页效果原理
  3. vant weapp 多选上传图片_iPhone竟然可以压缩图片?一秒1.7MB瞬间变0.08MB,太逆天了吧...
  4. oracle 唯一递增列,在oracle中创建unique唯一约束(单列和多列)
  5. linux mysql 客户端编码设置_mac和linux下mysql字符集设置问题
  6. c语言节点有指针域数据域,学习心得:链表的操作(C语言实现)
  7. python中的float和eval_python中eval和float_python中eval与json.loads对json的处理
  8. 百度港股开盘持续下跌,网络营销外包下百度二次上市遇冷
  9. 中小型企业开展网站关键词优化,怎样才能达到理想优化效果?
  10. pyspark读取hdfs 二进制文件