http://m.blog.csdn.net/blog/qpswwww/44105605

  1. #include<cstdio>
  2. #include<cmath>
  3. #include<algorithm>
  4. using namespace std;
  5. #define EPS 0.0000001
  6. #define N 311
  7. typedef double db;
  8. const db PI=acos(-1.0);
  9. struct Point{db x,y;};
  10. typedef Point Vector;
  11. Vector operator - (const Point &a,const Point &b){return (Vector){a.x-b.x,a.y-b.y};}
  12. Vector operator * (const Vector &a,const db &k){return (Vector){a.x*k,a.y*k};}
  13. Vector operator + (const Vector &a,const Vector &b){return (Vector){a.x+b.x,a.y+b.y};}
  14. db Cross(Vector a,Vector b){return a.x*b.y-a.y*b.x;}
  15. struct Line
  16. {
  17. Point p; Vector v; db ang;
  18. Line(){}
  19. Line(const Point &a,const Point &b)
  20. {
  21. v=b-a;
  22. p=a;
  23. ang=atan2(v.y,v.x);
  24. if(ang<0) ang+=2.0*PI;
  25. }
  26. };
  27. bool operator < (const Line &a,const Line &b){return a.ang<b.ang;}
  28. bool OnLeft(Line l,Point a){return Cross(l.v,a-l.p)>0;}
  29. Point GetJiaodian(Line a,Line b){return a.p+a.v*(Cross(b.v,a.p-b.p)/Cross(a.v,b.v));}
  30. int n;
  31. Point ps[N];
  32. Line q[N];
  33. int head=1,tail=1;
  34. Line ls[N];
  35. void BPMJ()
  36. {
  37. sort(ls+1,ls+n+1);
  38. q[1]=ls[1];
  39. for(int i=2;i<=n;++i)
  40. {
  41. while(head<tail&&(!OnLeft(ls[i],ps[tail-1]))) --tail;
  42. while(head<tail&&(!OnLeft(ls[i],ps[head]))) ++head;
  43. q[++tail]=ls[i];
  44. if(fabs(Cross(q[tail].v,q[tail-1].v))<EPS)
  45. {
  46. --tail;
  47. if(OnLeft(q[tail],ls[i].p))
  48. q[tail]=ls[i];
  49. }
  50. if(head<tail)
  51. ps[tail-1]=GetJiaodian(q[tail-1],q[tail]);
  52. }
  53. while(head<tail&&(!OnLeft(q[head],ps[tail-1]))) --tail;
  54. ps[tail]=GetJiaodian(q[tail],q[head]);
  55. }
  56. int nn;
  57. Point a[N];
  58. db ans=999999999999999999.0;
  59. #define INF 10000000000.0
  60. int main()
  61. {
  62. // freopen("bzoj1038.in","r",stdin);
  63. scanf("%d",&nn);
  64. for(int i=1;i<=nn;++i) scanf("%lf",&a[i].x);
  65. for(int i=1;i<=nn;++i) scanf("%lf",&a[i].y);
  66. for(int i=1;i<nn;++i) ls[++n]=Line(a[i],a[i+1]);
  67. ls[++n]=Line((Point){INF,INF},(Point){-INF,INF});
  68. ls[++n]=Line((Point){-INF,INF},(Point){-INF,-INF});
  69. ls[++n]=Line((Point){-INF,-INF},(Point){INF,-INF});
  70. ls[++n]=Line((Point){INF,-INF},(Point){INF,INF});
  71. BPMJ();
  72. for(int i=head;i<=tail;++i)
  73. for(int j=1;j<nn;++j)
  74. if(ps[i].x>=a[j].x&&ps[i].x<=a[j+1].x)
  75. {
  76. db ty=a[j].y+(ps[i].x-a[j].x)/(a[j+1].x-a[j].x)*(a[j+1].y-a[j].y);
  77. ans=min(ans,ps[i].y-ty);
  78. break;
  79. }
  80. for(int i=1;i<=nn;++i)
  81. {
  82. for(int j=head;j<tail;++j)
  83. if(a[i].x>=ps[j].x&&a[i].x<=ps[j+1].x)
  84. {
  85. db ty=ps[j].y+(a[i].x-ps[j].x)/(ps[j+1].x-ps[j].x)*(ps[j+1].y-ps[j].y);
  86. ans=min(ans,ty-a[i].y);
  87. }
  88. if(a[i].x>=ps[tail].x&&a[i].x<=ps[head].x)
  89. {
  90. db ty=ps[tail].y+(a[i].x-ps[tail].x)/(ps[head].x-ps[tail].x)*(ps[head].y-ps[tail].y);
  91. ans=min(ans,ty-a[i].y);
  92. }
  93. }
  94. printf("%.3lf\n",ans);
  95. return 0;
  96. }

【半平面交】bzoj1038 [ZJOI2008]瞭望塔的更多相关文章

  1. [BZOJ1038][ZJOI2008]瞭望塔(半平面交)

    1038: [ZJOI2008]瞭望塔 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2999  Solved: 1227[Submit][Statu ...

  2. bzoj千题计划126:bzoj1038: [ZJOI2008]瞭望塔

    http://www.lydsy.com/JudgeOnline/problem.php?id=1038 本题可以使用三分法 将点按横坐标排好序后 对于任意相邻两个点连成的线段,瞭望塔的高度 是单峰函 ...

  3. [日常摸鱼]bzoj1038 [ZJOI2008]瞭望塔-模拟退火/几何

    题意:给一条平面内$n$个点的折线,要求在折线上搞一个高度$h$的瞭望塔,能够看见折线上所有的点,求$h$的最小值($n \leq 300$) updata2018.1.21 正解半平面交在另一篇里面 ...

  4. bzoj1038: [ZJOI2008]瞭望塔

    Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, ...

  5. BZOJ-1038 [ZJOI2008]瞭望塔

    先求半平面交,然后建塔的地方肯定是在半平面交的交点上或者是在地面线段的交点上. #include <cstdlib> #include <cstdio> #include &l ...

  6. [日常摸鱼]bzoj1038[ZJOI2008]瞭望塔-半平面交

    这回好好用半平面交写一次- 看了cls当年写的代码看了好久大概看懂了-cls太强辣 #include<cstdio> #include<iostream> #include&l ...

  7. 【BZOJ1038】[ZJOI2008]瞭望塔 半平面交

    [BZOJ1038][ZJOI2008]瞭望塔 Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如 ...

  8. 【bzoj1038】瞭望塔

    [bzoj1038]瞭望塔 题意 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折 ...

  9. 【BZOJ 1038】 1038: [ZJOI2008]瞭望塔

    1038: [ZJOI2008]瞭望塔 Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 ...

随机推荐

  1. ISurfaceOp 接口生成等高线

    (1)ISurfaceOp.Contour 根据DEM生成等高线图层: private void button1_Click(object sender, EventArgs e)        {  ...

  2. java 获取classpath下文件多种方式

    java 获取classpath下文件多种方式 一:properties下配置 在resources下定义server.properties register.jks.path=classpath\: ...

  3. virtualenv创建虚拟环境安装flask

    virtualenv 有什么用?如果你象我一样热爱 Python ,那么除了基于 Flask 的项目外 还会有其他项目用到 Python .当项目越来越多时就会面对使用不同版本的 Python 的 问 ...

  4. java web项目获取各种路径

    1.可以在servlet的init方法里 String path = getServletContext().getRealPath("/"); 这将获取web项目的全路径 例如 ...

  5. Office2007在安装、卸载过程中出错的解决办法

    Micorsoft office professional plus 2007在安装过程中出错,错误1706 如果在安装OFFICE 2007的 时候,遇到“Microsoft Office 2007 ...

  6. 自动生成form Scripts

    运行脚本: begin xxx_plsql_generator_pkg2.form_view_iud_p(p_block_name =>'CONTRACT_T' ,p_table_name =& ...

  7. javascript关于闭包变量作用域

    在项目中不时会遇到的一些小的问题以及解决办法: 1子函数调用父函数中的变量: 加return: var a=1; function num(){ var b=2; return b; } num()+ ...

  8. Hadoop HDFS编程 API入门系列之HDFS_HA(五)

    不多说,直接上代码. 代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs3; import java.io.FileInputStream;import ...

  9. mysql批量执行sql文件

    1.待执行的sql文件为1.sql.2.sql.3.sql.4.sql等 2.写一个batch.sql文件: source .sql; source .sql; source .sql; source ...

  10. file access , argc, argv[ ]

    _____main函数含有 两个参数 ,argc ,argv[] 这两个参数用以指示命令行输入的参数信息. argc 的值是输入的参数的数量.argv是一个数组,每个数组元素指向一个string字符串 ...