想了很久,发现其实就只需要三分枚举圆上的点,到矩形的最短很容易就可以求到了。开始时考虑要不要根据矩形相对圆的方位来划分枚举区间,后来发现一定不能这样做的。

注意题目给的是矩形的对角形,但没说哪一条对角线哦,所以,注意。。。被这坑了好久。。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. const double PI=3.141592653;
  9. const double eps=1e-8;
  10. const double inf=1e10;
  11. struct Point{
  12. double x,y;
  13. };
  14. double xmin,ymin,xmax,ymax,r;
  15. Point start,center,first;
  16. double ans;
  17. Point corn[4];
  18.  
  19. double cal(double ang){
  20. double x=cos(ang)*first.x-sin(ang)*first.y;
  21. double y=cos(ang)*first.y+sin(ang)*first.x;
  22. double l1=sqrt((x-start.x)*(x-start.x)+(y-start.y)*(y-start.y));
  23. double l2=inf;
  24. for(int i=0;i<4;i++){
  25. l2=min(l2,sqrt((x-corn[i].x)*(x-corn[i].x)+(y-corn[i].y)*(y-corn[i].y)));
  26. }
  27. if(x-eps>=xmin&&x<=xmax-eps){
  28. if(y<=ymin-eps){
  29. l2=min(l2,ymin-y);
  30. }
  31. else if(y-eps>=ymax){
  32. l2=min(l2,y-ymax);
  33. }
  34. }
  35. else if(y-eps>=ymin&&y<=ymax-eps){
  36. if(x-eps>=xmax){
  37. l2=min(l2,x-xmax);
  38. }
  39. else if(x<=xmin-eps){
  40. l2=min(l2,xmin-x);
  41. }
  42. }
  43. return l1+l2;
  44. }
  45.  
  46. int main(){
  47. double l,r,m,mm;
  48. double a,b,c,d;
  49. while(scanf("%lf%lf",&start.x,&start.y)!=EOF){
  50. if(fabs(start.x)<eps && fabs(start.y)<eps) break;
  51. scanf("%lf%lf%lf",&center.x,&center.y,&r);
  52. scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
  53. xmin=min(a,c); xmax=max(a,c);
  54. ymin=min(b,d); ymax=max(b,d);
  55. start.x-=(center.x),start.y-=(center.y);
  56. xmin-=center.x,xmax-=center.x;
  57. ymin-=center.y,ymax-=center.y;
  58. center.x=center.y=0;
  59. corn[0].x=xmin,corn[0].y=ymin;
  60. corn[1].x=xmin,corn[1].y=ymax;
  61. corn[2].x=xmax,corn[2].y=ymin;
  62. corn[3].x=xmax,corn[3].y=ymax;
  63. first.x=center.x+r;
  64. first.y=center.y;
  65. l=0,r=PI; ans=inf;
  66. while(l+eps<r){
  67. m=(r+l)/2;
  68. mm=(m+r)/2;
  69. if(cal(m)>cal(mm)){
  70. l=m;
  71. }
  72. else r=mm;
  73. }
  74. ans=min(ans,cal(r));
  75. l=-PI,r=0;
  76. while(l+eps<r){
  77. m=(r+l)/2;
  78. mm=(m+r)/2;
  79. if(cal(m)>cal(mm)){
  80. l=m;
  81. }
  82. else r=mm;
  83. }
  84. ans=min(ans,cal(r));
  85. printf("%.2lf\n",ans);
  86. }
  87. return 0;
  88. }

  

HDU 4454的更多相关文章

  1. hdu 4454 Stealing a Cake(三分之二)

    pid=4454" target="_blank" style="">题目链接:hdu 4454 Stealing a Cake 题目大意:给定 ...

  2. HDU 4454 Stealing a Cake(枚举角度)

    题目链接 去年杭州现场赛的神题..枚举角度..精度也不用注意.. #include <iostream> #include <cstdio> #include <cstr ...

  3. HDU 4454 Stealing a Cake --枚举

    题意: 给一个点,一个圆,一个矩形, 求一条折线,从点出发,到圆,再到矩形的最短距离. 解法: 因为答案要求输出两位小数即可,精确度要求不是很高,于是可以试着爆一发,暴力角度得到圆上的点,然后求个距离 ...

  4. hdu 4454 Stealing a Cake 三分法

    很容易想到三分法求解,不过要分别在0-pi,pi-2pi进行三分. 另外也可以直接暴力枚举…… 代码如下: #include<iostream> #include<stdio.h&g ...

  5. hdu 4454 Stealing a Cake

    简单的计算几何: 可以把0-2*pi分成几千份,然后找出最小的: 也可以用三分: #include<cstdio> #include<cmath> #include<al ...

  6. hdu 4454 Stealing a Cake (三分)

    Stealing a Cake Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. HDU 4454 - Stealing a Cake(三分)

    我比较快速的想到了三分,但是我是从0到2*pi区间进行三分,并且漏了一种点到边距离的情况,一直WA了好几次 后来画了下图才发现,0到2*pi区间内是有两个极值的,每个半圆存在一个极值 以下是代码 #i ...

  8. hdu 4454 Stealing a Cake(三分法)

    给定一个起始点,一个矩形,一个圆,三者互不相交.求从起始点->圆->矩形的最短距离. 自己画一画就知道距离和会是凹函数,不过不是一个凹函数.按与水平向量夹角为圆心角求圆上某点坐标,[0, ...

  9. HDU - 4454: Stealing a Cake (圆上三分)

    pro:给定一个蛋糕,一个矩阵房子,一只蚂蚁.最开始三者两两相离,问蚂蚁触摸到蛋糕后再触摸矩阵的最短距离.结果保留两位小数,坐标的绝对值<1e4: sol:由于坐标不大,而且精度要求不高,不难想 ...

  10. hdu 4454 Stealing a Cake(计算几何:最短距离、枚举/三分)

    题意:已知起点.圆.矩形,要求计算从起点开始,经过圆(和圆上任一点接触即可),到达矩形的路径的最短距离.(可以穿过园). 分析:没什么好的方法,凭感觉圆上的每个点对应最短距离,应该是一个凸函数,用三分 ...

随机推荐

  1. bzoj4956: [Wf2017]Secret Chamber at Mount Rushmore

    F......loyd? 这范围也是..... 然而大了也不会.... #include<cstdio> #include<iostream> #include<cstr ...

  2. bzoj3224: Tyvj 1728 普通平衡树(splay)

    3224: Tyvj 1728 普通平衡树 题目:传送门 题解: 啦啦啦啦又来敲个模版水经验啦~ 代码: #include<cstdio> #include<cstring> ...

  3. Linux - 目录结构与查看,复制,删除,剪切指令

    Linux当中,一切皆文件. Linux目录结构 / 根分区,只有root用户对此目录拥有写权限. /etc 配置文件 /boot 启动文件 /var 可增长的目录 .日志,文件等. /root 管理 ...

  4. 基于scrapy-redis组件的分布式爬虫

    scrapy-redis组件安装 分布式实现流程 scrapy-redis组件安装 - 下载scrapy-redis组件:pip install scrapy-redis - 更改redis配置文件: ...

  5. Arduino-IIC-Wire.h

    前言:Wire.h是Arduino的IIC库. 一.Wire库函数 Wire.begin() Wire.requestFrom() Wire.beginTransmission() Wire.endT ...

  6. MVC中Excel导入

    1.在项目中添加对NPOI的引用,NPOI下载地址:http://npoi.codeplex.com/releases/view/38113. 前端代码 <div class="fil ...

  7. MBR分区表格式 - 简明概述

    目前硬盘主要有MBR和GPT分区两种格式,前者是Windows XP之前时代主流的分区格式,后者则是现在Windows 8之后主流的分区格式.(Windows 7需要通过一些手段能实现支持GPT,而W ...

  8. hdu2112 HDU Today 基础最短路

    这题的关键是把车站的名字转化为点的编号.我用的是map.声明一个map<string,int> st,然后按照字符串出现的次序给st赋值.例如:st[s1]=2;代表这字符串s1出现的次序 ...

  9. android 自定义空间 组合控件中 TextView 不支持drawableLeft属性

    android 自定义空间 组合控件中 TextView 不支持drawableLeft属性.会报错Caused by: android.view.InflateException: Binary X ...

  10. PHP入门及服务环境配置(Nginx+PHP)

    PHP入门及服务环境配置(Nginx+PHP) PHP入门 PHP维基百科: PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一 ...