hdu4454 三分 求点到圆,然后在到矩形的最短路
题意:
求点到圆,然后在到矩形的最短路.
思路:
把圆切成两半,然后对于每一半这个答案都是凸性的,最后输出两半中小的那个就行了,其中有一点,就是求点到矩形的距离,点到矩形的距离就是点到矩形四条边距离中最小的哪一个,求的方法有很多,一开始想都没想直接敲了个三分(这样就是两重三分了)跑了890ms AC的,后来看了看人家的都是直接用模板过的,我也找了个模板,结果31ms AC,哎,没事真的多暂歇模板,只有好处没坏处是了..
#include<stdio.h>
#include<math.h>
#include<algorithm> #define eps 1e-3
double PI=acos(-1.0); using namespace std; typedef struct
{
double x ,y;
}NODE; typedef struct
{
NODE A ,B;
}EDGE; NODE node[10];
EDGE edge[10];
NODE S ,O;
double diss1[10] ,diss2[10];
double R; bool camp(NODE a ,NODE b)
{
return a.x < b.x || a.x == b.x && a.y < b.y;
} double dis(NODE a ,NODE b)
{
double tmp = pow(a.x - b.x ,2.0) + pow(a.y - b.y ,2.0);
return sqrt(tmp);
} double minn(double x ,double y)
{
return x < y ? x : y;
} double abss(double x)
{
return x > 0 ? x : -x;
} NODE getnode(double du)
{
NODE ans;
ans.x = O.x + R *cos(du);
ans.y = O.y + R * sin(du);
return ans;
} //**********************************
struct Point
{
double x,y;
Point(double xx=0,double yy=0):x(xx),y(yy){}
Point operator -(const Point p1)
{
return Point(x-p1.x,y-p1.y);
}
double operator ^(const Point p1)
{
return x*p1.x+y*p1.y;
}
};
double cross(Point a,Point b)
{
return a.x*b.y-a.y*b.x;
}
inline int sign(double d)
{
if(d>eps)return 1;
else if(d<-eps)return -1;
else return 0;
}
double dis(Point A ,Point B)
{
return sqrt(pow(A.x - B.x ,2.0) + pow(A.y - B.y ,2.0));
}
double ptoline(Point tp,Point st,Point ed)//求点到线段的距离
{
double t1=dis(tp,st);
double t2=dis(tp,ed);
double ans=min(t1,t2);
if(sign((ed-st)^(tp-st))>=0 && sign((st-ed)^(tp-ed))>=0)//锐角
{
double h=fabs(cross(st-tp,ed-tp))/dis(st,ed);
ans=min(ans,h);
}
return ans;
}
//************************
double search3_2(double L ,double R)
{
double low ,up ,mid ,mmid;
NODE now;
low = L ,up = R;
while(1)
{
mid = (low + up) / 2;
now = getnode(mid);
Point A ,B ,C;
A.x = now.x ,A.y = now.y;
for(int i = 1 ;i <= 4 ;i ++)
{
B.x = edge[i].B.x ,B.y = edge[i].B.y;
C.x = edge[i].A.x ,C.y = edge[i].A.y;
diss1[i] = ptoline(A ,B ,C) + dis(S ,now); }
sort(diss1 + 1 ,diss1 + 4 + 1);
mmid = (mid + up) / 2;
now = getnode(mmid); A.x = now.x ,A.y = now.y;
for(int i = 1 ;i <= 4 ;i ++)
{
B.x = edge[i].B.x ,B.y = edge[i].B.y;
C.x = edge[i].A.x ,C.y = edge[i].A.y;
diss2[i] = ptoline(A ,B ,C) + dis(S ,now);
}
sort(diss2 + 1 ,diss2 + 4 + 1);
if(diss1[1] > diss2[1]) low = mid;
else up = mmid;
if(abss(low - up) < eps) break;
}
return diss1[1];
} int main ()
{
while(~scanf("%lf %lf" ,&S.x ,&S.y))
{
if(S.x == 0 && S.y == 0) break;
scanf("%lf %lf %lf" ,&O.x ,&O.y ,&R);
scanf("%lf %lf %lf %lf" ,&node[1].x ,&node[1].y ,&node[2].x ,&node[2].y);
node[3].x = node[1].x ,node[3].y = node[2].y;
node[4].x = node[2].x ,node[4].y = node[1].y;
sort(node + 1 ,node + 4 + 1 ,camp);
edge[1].A.x = node[1].x ,edge[1].A.y = node[1].y;
edge[1].B.x = node[2].x ,edge[1].B.y = node[2].y;
edge[2].A.x = node[2].x ,edge[2].A.y = node[2].y;
edge[2].B.x = node[4].x ,edge[2].B.y = node[4].y;
edge[3].A.x = node[4].x ,edge[3].A.y = node[4].y;
edge[3].B.x = node[3].x ,edge[3].B.y = node[3].y;
edge[4].A.x = node[3].x ,edge[4].A.y = node[3].y;
edge[4].B.x = node[1].x ,edge[4].B.y = node[1].y;
printf("%.2lf\n" ,minn(search3_2(0 ,PI) ,search3_2(PI ,2*PI)));
}
return 0;
}
hdu4454 三分 求点到圆,然后在到矩形的最短路的更多相关文章
- hihocoder 1142 三分求极值【三分算法 模板应用】
#1142 : 三分·三分求极值 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 这一次我们就简单一点了,题目在此: 在直角坐标系中有一条抛物线y=ax^2+bx+c和一 ...
- Gym-101158J Cover the Polygon with Your Disk 计算几何 求动圆与多边形最大面积交
题面 题意:给出小于10个点形成的凸多边形 和一个半径为r 可以移动的圆 求圆心在何处的面积交最大,面积为多少 题解:三分套三分求出圆心位置,再用圆与多边形面积求交 #include<bits/ ...
- Hihocoder #1142 : 三分·三分求极值
1142 : 三分·三分求极值 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 这一次我们就简单一点了,题目在此: 在直角坐标系中有一条抛物线y=ax^2+bx+c和一个 ...
- Python 求点到直线的垂足
Python 求点到直线的垂足 在已知一个点,和一条已知两个点的直线的情况下 运算公式参考链接:https://www.cnblogs.com/mazhenyu/p/3508735.html def ...
- POJ 2546 & ZOJ 1597 Circular Area(求两圆相交的面积 模板)
题目链接: POJ:http://poj.org/problem? id=2546 ZOJ:problemId=597" target="_blank">http: ...
- hdu 1174:爆头(计算几何,三维叉积求点到线的距离)
爆头 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...
- HLJU 1221: 高考签到题 (三分求极值)
1221: 高考签到题 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 9 Solved: 4 [Submit][id=1221">St ...
- HDU 4355——Party All the Time——————【三分求最小和】
Party All the Time Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- ZOJ 3203 Light Bulb( 三分求极值 )
链接:传送门 题意: 求影子长度 L 的最大值 思路:如果 x = 0 ,即影子到达右下角时,如果人继续向后走,那么影子一定是缩短的,所以不考虑这种情况.根据图中的辅助线外加相似三角形定理可以得到 L ...
随机推荐
- MySql学习---数据库基本类型,事务,多表查询
数据库分类 关系型数据库 行列, 列如Mysql,oracle 通过表和表之间,行和列之间的关系进行数据的存储 非关系型数据库: Redis,MongDb 以对象存储,同过对象的自身属性来决定 表与表 ...
- 上线 Python 应用仅需一条命令的开源框架:Zappa(详细教程)
本文面向有 Python Web 基础的小伙伴 作者:HelloGitHub-吱吱 这里是 HelloGitHub 推出的<讲解开源项目>系列,今天要向小伙伴们介绍一个 Python 无服 ...
- RPC基础以及造一个RPC的轮子需要注意些什么
RPC基础以及造一个RPC的轮子需要注意些什么 前言 rpc即远程过程调用,是分布式系统常用的通信方法.远程可以是在一台机器上的不同进程或在不同一个机器上的不同进程.rpc更看重速度,像调用本地方法一 ...
- unittest系列(一)unittest简介和示例
unittest - 单元测试框架 单元测试框架是受到 JUnit 的启发,与其他语言中的主流单元测试框架有着相似的风格.其支持测试自动化,配置共享和关机代码测试.支持将测试样例聚合到测试集中,并将测 ...
- (数据科学学习手札112)Python+Dash快速web应用开发——表单控件篇(上)
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...
- io流(io流的引入与文件字节流)
io流的引入与文件字节流 io流:就是一根吸管,插入后,可以操作目标文件 io流的分类: 按方向:输入,输出 按大小:字节,字符 按处理方式: 处理流:"管套着管" --- 流结合 ...
- ARFoundation - 实现物体旋转, 平移,缩放
ARFoundation - 实现物体旋转, 平移,缩放 本文目的是为了确定在移动端怎样通过单指滑动实现物体的旋转,双指实现平移和缩放. 前提知识: ARFoundation - touch poin ...
- python基础之流程控制(2)
今天将是基础篇的最后一篇,咱们来补上最后一个内容,流程控制for循环 For 循环 一.为什么有for循环? for循环能做的事情,while循环全都可以实现,但是在某些情境下,for循环相对于whi ...
- java例题_36 移动数组中数据位置(用到数组的合并操作)
1 /*36 [程序 36 移动位置] 2 题目:有 n 个整数,使其前面各数顺序向后移 m 个位置,最后 m 个数变成最前面的 m 个数,比如输入数字 3 为 1 2 3 4 5 6 7 8 9 0 ...
- 全网最详细的Linux命令系列-cat命令
cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 命令格式: cat [选项] [文件].. ...