HDU 4454 - Stealing a Cake(三分)
我比较快速的想到了三分,但是我是从0到2*pi区间进行三分,并且漏了一种点到边距离的情况,一直WA了好几次
后来画了下图才发现,0到2*pi区间内是有两个极值的,每个半圆存在一个极值
以下是代码
#include <cstdio>
#include <cmath>
#include <algorithm>
#define pi acos(-1.0)
using namespace std; typedef struct
{
double x;
double y;
}point; typedef struct
{
double x;
double y;
double r;
}circle; typedef struct
{
point s;
point e;
}line; double dis(point a,point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} double cal(point st,line ed,circle c,double t)
{
point p;
p.x=c.x+cos(t)*c.r;
p.y=c.y+sin(t)*c.r;
if(fabs(ed.s.x-ed.e.x)<1e-8)
{
if(p.y>ed.s.y&&p.y<ed.e.y)
{
return dis(p,st)+fabs(p.x-ed.s.x);
}
else
{
double t=min(dis(p,ed.s),dis(p,ed.e));
return dis(p,st)+t;
} }
if(fabs(ed.s.y-ed.e.y)<1e-8)
{
if(p.x>ed.s.x&&p.x<ed.e.x)
{
return dis(p,st)+fabs(p.y-ed.s.y);
}
else
{
double t=min(dis(p,ed.s),dis(p,ed.e));
return dis(p,st)+t;
}
}
return -1;
} double solve1(point st,line ed,circle c)
{
double L=0,R=pi,mid=(L+R)/2,midmid=(mid+R)/2;
while(R-L>1e-10)
{
if(cal(st,ed,c,mid)<cal(st,ed,c,midmid))R=midmid;
else L=mid;
mid=(L+R)/2;
midmid=(R+mid)/2;
}
return cal(st,ed,c,midmid);
} double solve2(point st,line ed,circle c)
{
double L=pi,R=2*pi,mid=(L+R)/2,midmid=(mid+R)/2;
while(R-L>1e-10)
{
if(cal(st,ed,c,mid)<cal(st,ed,c,midmid))R=midmid;
else L=mid;
mid=(L+R)/2;
midmid=(R+mid)/2;
}
return cal(st,ed,c,midmid);
} int main()
{
double m,x[2],y[2];
point st;
circle cir;
line a[4];
while(scanf("%lf%lf",&st.x,&st.y)==2)
{
if(!st.x&&!st.y)break;
scanf("%lf%lf%lf",&cir.x,&cir.y,&cir.r);
scanf("%lf%lf",&x[0],&y[0]);
scanf("%lf%lf",&x[1],&y[1]);
if(x[0]>x[1]) swap(x[0],x[1]);
if(y[0]>y[1]) swap(y[0],y[1]);
a[0].s.x=x[0];a[0].s.y=y[0];
a[0].e.x=x[0];a[0].e.y=y[1];
a[1].s.x=x[0];a[1].s.y=y[0];
a[1].e.x=x[1];a[1].e.y=y[0];
a[2].s.x=x[1];a[2].s.y=y[0];
a[2].e.x=x[1];a[2].e.y=y[1];
a[3].s.x=x[0];a[3].s.y=y[1];
a[3].e.x=x[1];a[3].e.y=y[1];
m=1e18;
for(int i=0;i<4;i++)
{
double t=solve1(st,a[i],cir);
if(t<m)m=t;
t=solve2(st,a[i],cir);
if(t<m)m=t;
}
printf("%.2lf\n",m);
}
return 0;
}
HDU 4454 - Stealing a Cake(三分)的更多相关文章
- hdu 4454 Stealing a Cake (三分)
Stealing a Cake Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 4454 Stealing a Cake(三分之二)
pid=4454" target="_blank" style="">题目链接:hdu 4454 Stealing a Cake 题目大意:给定 ...
- hdu 4454 Stealing a Cake(计算几何:最短距离、枚举/三分)
题意:已知起点.圆.矩形,要求计算从起点开始,经过圆(和圆上任一点接触即可),到达矩形的路径的最短距离.(可以穿过园). 分析:没什么好的方法,凭感觉圆上的每个点对应最短距离,应该是一个凸函数,用三分 ...
- hdu 4454 Stealing a Cake 三分法
很容易想到三分法求解,不过要分别在0-pi,pi-2pi进行三分. 另外也可以直接暴力枚举…… 代码如下: #include<iostream> #include<stdio.h&g ...
- hdu 4454 Stealing a Cake
简单的计算几何: 可以把0-2*pi分成几千份,然后找出最小的: 也可以用三分: #include<cstdio> #include<cmath> #include<al ...
- hdu 4454 Stealing a Cake(三分法)
给定一个起始点,一个矩形,一个圆,三者互不相交.求从起始点->圆->矩形的最短距离. 自己画一画就知道距离和会是凹函数,不过不是一个凹函数.按与水平向量夹角为圆心角求圆上某点坐标,[0, ...
- HDU 4454 Stealing a Cake(枚举角度)
题目链接 去年杭州现场赛的神题..枚举角度..精度也不用注意.. #include <iostream> #include <cstdio> #include <cstr ...
- HDU 4454 Stealing a Cake --枚举
题意: 给一个点,一个圆,一个矩形, 求一条折线,从点出发,到圆,再到矩形的最短距离. 解法: 因为答案要求输出两位小数即可,精确度要求不是很高,于是可以试着爆一发,暴力角度得到圆上的点,然后求个距离 ...
- hdu 4771 Stealing Harry Potter's Precious(bfs)
题目链接:hdu 4771 Stealing Harry Potter's Precious 题目大意:在一个N*M的银行里,贼的位置在'@',如今给出n个宝物的位置.如今贼要将全部的宝物拿到手.问最 ...
随机推荐
- 关于python抓取google搜索结果的若干问题
关于python抓取google搜索结果的若干问题 前一段时间一直在研究如何用python抓取搜索引擎结果,在实现的过程中遇到了很多的问题,我把我遇到的问题都记录下来,希望以后遇到同样问题的童 ...
- 构建基于Jenkins + Github的持续集成环境
搭建持续集成首先要了解什么是持续集成,带着明确的目标去搭建持续集成环境才能让我们少走很多弯路.持续集成(Continuous integration)简称CI,是一种软件开发的实践,可以让团队在持续集 ...
- Net MVC微信扫码支付
微信扫码支付+Asp.Net MVC 这里的扫码支付指的是PC网站上面使用微信支付,也就是官方的模式二,网站是Asp.net MVC,整理如下. 一.准备工作 使用的微信API中的统一下单方法,关键的 ...
- jstorm简介(转)
Jstorm是参考storm的实时流式计算框架,在网络IO.线程模型.资源调度.可用性及稳定性上做了持续改进,已被越来越多企业使用 作为commiter和user,我还是非常看好它的应用前景,下面是在 ...
- Windows Azure使用体验
Windows Azure在今年6月6日由世纪互联代理在中国运营,目前只能体验,没有开放注册.不过,体验的门槛比较高,只对企业开放,未来大量对外开放使用貌似时间还早.大家都懂得,“国内门槛高”.本人在 ...
- React-TodoList
React入门最好的学习实例-TodoList 前言 React 的核心思想是:封装组件,各个组件维护自己的状态和 UI,当状态变更,自动重新渲染整个组件. 最近前端界闹的沸沸扬扬的技术当属react ...
- Hibernate(五)——经典解析一对一关联映射
前面两篇介绍了多对一.一对多的映射.今天分享下一对一的关联映射关系.有两种策略可以实现一对一的关联映射:主键关联.唯一外键关联. 主键关联——两个表有完全相同的主键值,来表示它们的一对一的关系.数据库 ...
- Delphi 数据类型列表 good
Delphi 数据类型列表 分类 范围 字节 备注 简单类型 序数 整数 Integer -2147483648 .. 2147483647 4 有符号32位 Cardinal 0 .. 429496 ...
- Delphi结构中使用String时遇到的内存泄露问题(没有利用String的引用计数自动销毁字符串的功能)
先定义一个结构: TUserInfo = record UserID: Integer; // 用户编号 UserName: string; // 用户名end; 然后编写如下代码: proced ...
- 得到一个div下 特定ID的所有标签
比如说得到 <div id="showsp"> <div id="a"></div> <div id="a& ...