很容易想到三分法求解,不过要分别在0-pi,pi-2pi进行三分。

另外也可以直接暴力枚举……

代码如下:

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<algorithm>
  4. #include<iomanip>
  5. #include<cmath>
  6. #include<cstring>
  7. #include<vector>
  8. #define ll __int64
  9. #define pi acos(-1.0)
  10. #define MAX 50000
  11. using namespace std;
  12. struct point
  13. {
  14. double x,y;
  15. point(double _x=,double _y=){
  16. x=_x;
  17. y=_y;
  18. }
  19. point operator-(point a){
  20. return point(x-a.x,y-a.y);
  21. }
  22. point operator+(point a){
  23. return point(x+a.x,y+a.y);
  24. }
  25. double operator*(point a){
  26. return (x*a.x+y*a.y);
  27. }
  28. }p1,p2,p;
  29. double x,y,r;
  30. double dis2(point a,point b)
  31. {
  32. return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
  33. }
  34. double dis(point a, point b, point c)
  35. {
  36. point ab = b - a;
  37. point ac = c - a;
  38. double f = ab*ac;
  39. if (f<) return dis2(c, a);//C1处的点
  40. double d = ab*ab;
  41. if ( f>d) return dis2(c, b);//C2处的点,d=f*cos(theta)
  42. f = f/d;
  43. ab.x*=f;ab.y*=f;
  44. point D = a + ab; // c在ab线段上的投影点
  45. return dis2(c, D);
  46. }
  47. double line(point a)
  48. {
  49. point b,c;
  50. b.x=min(p1.x,p2.x);
  51. b.y=max(p1.y,p2.y);
  52. c.x=max(p1.x,p2.x);
  53. c.y=min(p1.y,p2.y);
  54. double MIN1,MIN2;
  55. MIN1=min(dis(p2,c,a),dis(p1,c,a));
  56. MIN2=min(dis(p1,b,a),dis(p2,b,a));
  57. return min(MIN1,MIN2);
  58. }
  59. point get(double a)
  60. {
  61. return point(x+r*cos(a),y+r*sin(a));
  62. }
  63. double solve()
  64. {
  65. double r,l,mid,midmid,t1,t2,ans1,ans2;
  66. point m1,m2;
  67. r=pi;l=;
  68. while(r-l>=1e-){
  69. mid=(r+l)/;
  70. midmid=(mid+r)/;
  71. m1=get(mid);
  72. m2=get(midmid);
  73. t1=line(m1)+dis2(m1,p);
  74. t2=line(m2)+dis2(m2,p);
  75. if(t1>t2) l=mid;
  76. else r=midmid;
  77. }
  78. ans1=t1;
  79. r=*pi;l=pi;
  80. while(r-l>=1e-){
  81. mid=(r+l)/;
  82. midmid=(mid+r)/;
  83. m1=get(mid);
  84. m2=get(midmid);
  85. t1=line(m1)+dis2(m1,p);
  86. t2=line(m2)+dis2(m2,p);
  87. if(t1>t2) l=mid;
  88. else r=midmid;
  89. }
  90. ans2=t1;
  91. return min(ans1,ans2);
  92. }
  93. int main(){
  94. while(cin>>p.x>>p.y){
  95. if(fabs(p.x)<1e-&&fabs(p.y)<1e-) break;
  96. cin>>x>>y>>r>>p1.x>>p1.y>>p2.x>>p2.y;
  97. point temp;
  98. temp.x=p1.x;temp.y=p1.y;
  99. p1.x=min(p1.x,p2.x);p1.y=min(p1.y,p2.y);
  100. p2.x=max(temp.x,p2.x);p2.y=max(temp.y,p2.y);
  101. printf("%.2lf\n",solve());
  102. }
  103. return ;
  104. }

hdu 4454 Stealing a Cake 三分法的更多相关文章

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

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

  2. hdu 4454 Stealing a Cake (三分)

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

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

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

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

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

  5. HDU 4454 Stealing a Cake --枚举

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

  6. hdu 4454 Stealing a Cake

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

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

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

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

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

  9. hdu 4771 Stealing Harry Potter&#39;s Precious(bfs)

    题目链接:hdu 4771 Stealing Harry Potter's Precious 题目大意:在一个N*M的银行里,贼的位置在'@',如今给出n个宝物的位置.如今贼要将全部的宝物拿到手.问最 ...

随机推荐

  1. Windows Phone 8.1 页面导航

    1. Windows Phone 8.1 的应用框架 一个应用拥有 1 个 Window,一个 Window 包含 1 个 Frame,一个 Frame 包含 多个 Page. 获取 Frame 的方 ...

  2. [OpenXml] Generate excel in memory and dump to file

    public static void GenerateExcelFromStream() { using (MemoryStream memoryStream = new MemoryStream() ...

  3. C# - write values to configuration file

    using System.Configuration;System.Configuration.Configuration config = ConfigurationManager.OpenExeC ...

  4. HttpUnit学习笔记

    <!-- htmlUnit --> <dependency> <groupId>net.sourceforge.htmlunit</groupId> & ...

  5. 普通用户开启AUTOTRACE 功能

    AUTOTRACE是一个SQL*Plus工具,用于跟踪SQL的执行计划,收集执行时所耗用资源的统计信息.系统账户本身具有AUTOTRACE,其他账户需要通过手动赋予 一. 用系统账户登录(DBA) S ...

  6. Ubuntu虚拟机与Window、Arm的通信

    Ubuntu虚拟机与Window的通信安装有Ubuntu14.04的虚拟机VMware,将虚拟机的网络适配器配置成NAT类型(默认使用VMnet8进行通信),此时将Ubuntu的IP地址设置成与VMn ...

  7. JS和JSP的区别

    最近很多同学在纠结于名词缩写之间的相似性,因此本人也来写一篇,讲讲JS和JSP的区别. SUN首先发展出SERVLET,其功能比较强劲,体系设计也很先进,只是,它输出HTML语句还是采用了老的CGI方 ...

  8. fedora 禁止nouveau加载

    To remove / disable nouveau drivers from kernel initramfs ## Backup old initramfs nouveau image ## m ...

  9. mac OS X 10.9.1 配置jdk环境变量

    进入命令行 cd ~ touch .bash_profile vi .bash_profile 输入内容jdk变量配置内容: export JAVA_HOME=/Library/Java/JavaVi ...

  10. StatusStrip状态栏控件

    1.ToolStripStatusLabel statusstrip1.Items[].Text="日期"+DateTime.Now.ToString(); Thread p = ...