很容易想到三分法求解,不过要分别在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=0,double _y=0){
 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<0) 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=0;
 68     while(r-l>=1e-8){
 69         mid=(r+l)/2;
 70         midmid=(mid+r)/2;
 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=2*pi;l=pi;
 80     while(r-l>=1e-8){
 81         mid=(r+l)/2;
 82         midmid=(mid+r)/2;
 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-8&&fabs(p.y)<1e-8) 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 0;
104 }

View Code

转载于:https://www.cnblogs.com/xin-hua/p/3253215.html

hdu 4454 Stealing a Cake 三分法相关推荐

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

    题目链接:hdu 4454 Stealing a Cake 题目大意:给定一个起始点s,一个圆形.一个矩形.如今从起点開始,移动到圆形再移动到矩形.求最短距离. 解题思路:在圆周上三分就可以.即对角度 ...

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

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

  3. HDU - 6681 Rikka with Cake

    Rikka with Cake Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) P ...

  4. hdu - 6681 Rikka with Cake 线段树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6681 题意:给定一个左下顶点为,右上顶点为的矩形,然后给你k条射线,每条射线的起点及方向(上下左右)都 ...

  5. HDU 6681 Rikka with Cake(扫描线、动态开点线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6681 题意 在矩形区域内有k条射线,问这些射线将矩形分成了多少区域 题解 容易发现答案为所有射线交点个数+1. ...

  6. HDU 6681 Rikka with Cake (可持久化线段树)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=6681 题意:一个n*m的矩形蛋糕,每次给一个点(x, y)和方向dir确定一条切的线,问最后把蛋糕分成了几 ...

  7. HDU - 5640 -King's Cake

    It is the king's birthday before the military parade . The ministers prepared a rectangle cake of si ...

  8. HDU-4454 Stealing a Cake 三分枚举

    题意:给定一个点,一个圆,以及一个矩形,现在问从一个点到一个圆再到一个矩形的最短距离为多少?到达一个目标可以只挨着或者穿过它. 解法:目前只知道从一个点到圆上按照[0,PI],[PI,2*PI]的两个 ...

  9. HDU 3400 Line belt【三分法】

    题意: 有两条线段,在其中一条线段上移动的速度为 v1,在另一条线上速度为v2, 在其他地方移动速度为 r,问从其中一条线段的一个端点移动到另一个线段 的一个端点的最少时间. 分析: 在其中一条线段上 ...

最新文章

  1. 【青少年编程】陈晓光:打靶游戏
  2. 【Socket网络编程】17. recv() 函数详解
  3. 重磅!神策 2018 数据驱动大会报名正式开启!
  4. 使用lamba中stream 进行分组统计
  5. python 类中方法总结 --- 实例方法、类方法、静态方法
  6. C#类、接口、虚方法和抽象方法
  7. C++对象内存布局测试总结
  8. DCMTK:Receiving Images from PACS using DCMSCU
  9. LTE学习:天线端口数目和物理天线数目关系
  10. 怒爬某 Hub 资源就为撸了一个鉴黄平台
  11. STAR-CCM+ 计算RAE-2822翼型在FATP巡航状态下不同攻角下的升力系数。
  12. Request和response的用法总结
  13. Nginx 配置上传文件大小限制
  14. Ubuntu怎么切换为中文版
  15. 基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(八)使用domoticz+mosquitto+Android客户端实现控制mini2440上的LED(一)
  16. android最新版本6,keep安卓官方最新版
  17. itext生成打印(操作PDF)
  18. 漏洞复现----42、Spring Cloud Gateway Actuator API SpEL表达式注入命令执行(CVE-2022-22947)
  19. STM32F767串口通信------USART中断接收
  20. Linux软硬链接和软硬限制

热门文章

  1. Flutter获取随机数 Dart语言核心基础
  2. SpringBoot中的@ConfigurationProperties
  3. Spring AOP源码解析——专治你不会看源码的坏毛病!
  4. Hadoop集群配置搭建
  5. Hive篇--搭建Hive集群
  6. 最实用的APP界面设计知识,有温度的APP设计(转)
  7. thinkPhp 3.1.3的验证码无法显示的问题
  8. IIS7 配置 PHP
  9. 四种方式话Equal
  10. 前端基础git(一)-git入门代码版本控制介绍