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

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

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; const double PI=3.141592653;
const double eps=1e-8;
const double inf=1e10;
struct Point{
double x,y;
};
double xmin,ymin,xmax,ymax,r;
Point start,center,first;
double ans;
Point corn[4]; double cal(double ang){
double x=cos(ang)*first.x-sin(ang)*first.y;
double y=cos(ang)*first.y+sin(ang)*first.x;
double l1=sqrt((x-start.x)*(x-start.x)+(y-start.y)*(y-start.y));
double l2=inf;
for(int i=0;i<4;i++){
l2=min(l2,sqrt((x-corn[i].x)*(x-corn[i].x)+(y-corn[i].y)*(y-corn[i].y)));
}
if(x-eps>=xmin&&x<=xmax-eps){
if(y<=ymin-eps){
l2=min(l2,ymin-y);
}
else if(y-eps>=ymax){
l2=min(l2,y-ymax);
}
}
else if(y-eps>=ymin&&y<=ymax-eps){
if(x-eps>=xmax){
l2=min(l2,x-xmax);
}
else if(x<=xmin-eps){
l2=min(l2,xmin-x);
}
}
return l1+l2;
} int main(){
double l,r,m,mm;
double a,b,c,d;
while(scanf("%lf%lf",&start.x,&start.y)!=EOF){
if(fabs(start.x)<eps && fabs(start.y)<eps) break;
scanf("%lf%lf%lf",&center.x,&center.y,&r);
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
xmin=min(a,c); xmax=max(a,c);
ymin=min(b,d); ymax=max(b,d);
start.x-=(center.x),start.y-=(center.y);
xmin-=center.x,xmax-=center.x;
ymin-=center.y,ymax-=center.y;
center.x=center.y=0;
corn[0].x=xmin,corn[0].y=ymin;
corn[1].x=xmin,corn[1].y=ymax;
corn[2].x=xmax,corn[2].y=ymin;
corn[3].x=xmax,corn[3].y=ymax;
first.x=center.x+r;
first.y=center.y;
l=0,r=PI; ans=inf;
while(l+eps<r){
m=(r+l)/2;
mm=(m+r)/2;
if(cal(m)>cal(mm)){
l=m;
}
else r=mm;
}
ans=min(ans,cal(r));
l=-PI,r=0;
while(l+eps<r){
m=(r+l)/2;
mm=(m+r)/2;
if(cal(m)>cal(mm)){
l=m;
}
else r=mm;
}
ans=min(ans,cal(r));
printf("%.2lf\n",ans);
}
return 0;
}

  

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. c++11 实现半同步半异步线程池

    感受: 随着深入学习,现代c++给我带来越来越多的惊喜- c++真的变强大了. 半同步半异步线程池: 事实上非常好理解.分为三层 同步层:通过IO复用或者其它多线程多进程等不断的将待处理事件加入到队列 ...

  2. 2016.04.18,英语,《Vocabulary Builder》Unit 15

    term/termin, comes from the Latin verb terminare, 'to limit, bound, or set limits to', or the relate ...

  3. Elo rating system(Elo 打分体系)

    A.B 两个待比较.评价的对象,分别打分为 RA,RB,则各自获胜的期望值为: ⎧⎩⎨⎪⎪⎪⎪⎪⎪EA=11+10(RB−RA)/400.EB=11+10(RA−RB)/400. 不妨令 QA=10R ...

  4. 负载均衡获得真实源IP的6种方法

    除了X-FORWARD-FOR,负载均衡中获得真实源IP的方法还有很多种. 本文抛砖引玉,主要介绍获得真实源IP的多种方法,而不是具体配置. 负载均衡获得真实IP的方法有很多种,将形成专题文章. 本文 ...

  5. function at line ### more than 60 upvalues

    lua中函数的upvalues是有上限的,在luaconf.h中定义: /*@@ LUAI_MAXUPVALUES is the maximum number of upvalues per func ...

  6. Redux入门

    Redux入门 本文转载自:众成翻译 译者:miaoYu 链接:http://www.zcfy.cc/article/4728 原文:https://bumbu.github.io/simple-re ...

  7. 常用的CSS命名

    头:header 内容:content/container 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体佈局宽度:wrapper 左右中:left rig ...

  8. Paint、Canvas.1

    Canvas 方法详解 1:translate(float dx, float dy) /**** 移动canvas的原点到(dx,dy),默认为(0,0) */ public void transl ...

  9. ObjectT5:在线随机森林-Multi-Forest-A chameleon in track in

    原文::Multi-Forest:A chameleon in tracking,CVPR2014  下的蛋...原文 使用随机森林的优势,在于可以使用GPU把每棵树分到一个流处理器里运行,容易并行化 ...

  10. 将自己的类封装为lib的方法

    前言: Windows API中所有的函数都包含在dll中,其中有3个最重要的DLL. (1)   Kernel32.dll 它包含那些用于管理内存.进程和线程的函数,例如CreateThread函数 ...