NC16746 神奇盘子
NC16746 神奇盘子
题目
题目描述
有一个神奇的盘子,形状为圆形。盘子上面爬着一个大象(视作一个点)。由于现实的扭曲,当大象在盘子某个直径的一端的时候,可以瞬间传送至直径的另一端。现在大象想去盘子上另外一点,问他最少需要移动多少距离。传送不计距离。
输入描述
第一行一个整数r(1 <= r <= 1000)代表盘子的半径。
接下来两行两个整点分别代表大象所在的位置和大象目标的位置坐标。保证两个点都在圆内(可能在边界上),圆心在点(0, 0)上。
输出描述
输出一个实数,代表大象最短需要移动多少距离。和标程相对或绝对相差1e-6都算正确。
示例1
输入
1
0 1
0 -1
输出
0.000000000000
示例2
输入
4
3 0
-3 0
输出
2.000000000000
说明
示例3
输入
100
-59 76
3 69
输出
62.393909959226
题解
思路
知识点:计算几何,三分。
可以知道圆周上有一极小点使得通过传送的方法后距离是最短的,用这个最小值,与直接走过去对比取最小。
对弧度三分 \(l = 0,r = 2\pi\) ,用参数方程表示出圆周上点坐标,随后计算两个三分点的各自距离之和,然后比较舍大区间。
要注意的是误差开大一点。
\(\pi\) 可以通过 \(acos(-1.0)\) 取得较精确的值。
对称点的原弧度加上 \(\pi\) 生成即可。
实数范围 \(l\) 和 \(r\) 都可以,因为都在误差范围。
时间复杂度 \(O(1)\)
空间复杂度 \(O(1)\)
代码
#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1.0);
const double eps = 1e-6;
struct Point {
double x, y;
}a, b;
double r;
double dist(Point a, Point b) {
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
Point f(double rad) {
return { r * cos(rad), r * sin(rad) };
}
bool check(double mid1, double mid2) {
double d1 = dist(a, f(mid1)) + dist(f(mid1 + PI), b);
double d2 = dist(a, f(mid2)) + dist(f(mid2 + PI), b);
return d1 <= d2;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> r >> a.x >> a.y >> b.x >> b.y;
double ans = dist(a, b);
double l = 0, r = 2 * PI;
while (r - l >= eps) {
double mid1 = l + (r - l) / 3;
double mid2 = r - (r - l) / 3;
if (check(mid1, mid2)) r = mid2;
else l = mid1;
}
ans = min(ans, dist(a, f(l)) + dist(f(l + PI), b));
cout << fixed << setprecision(8) << ans << '\n';
return 0;
}
NC16746 神奇盘子的更多相关文章
- 视觉暂留-Info:这些神奇的“视觉暂留”动画,每一幅都让人拍案叫绝!
ylbtech-视觉暂留-Info:这些神奇的“视觉暂留”动画,每一幅都让人拍案叫绝! 1.返回顶部 1. 这些神奇的“视觉暂留”动画,每一幅都让人拍案叫绝! 原创|发布:2018-05-28 19: ...
- 端盘子的服务生到月薪一万五的IT精英,你能相信吗
一直以来,我都觉得自己不是一个有故事的人. 以前的我,是个乖宝宝,对父母言听计从,特别内向,甚至一度感觉到自卑.不上学之后,我干过送货员,去工地除泥搬砖,当过油漆工,去过工厂,还去饭店当过端盘子的服务 ...
- BZOJ 1006 【HNOI2008】 神奇的国度
题目链接:神奇的国度 一篇论文题--神奇的弦图,神奇的MCS-- 感觉我没有什么需要多说的,这里简单介绍一下MCS: 我们给每个点记录一个权值,从后往前依次确定完美消除序列中的点,每次选择权值最大的一 ...
- 前端精选文摘:BFC 神奇背后的原理
BFC 已经是一个耳听熟闻的词语了,网上有许多关于 BFC 的文章,介绍了如何触发 BFC 以及 BFC 的一些用处(如清浮动,防止 margin 重叠等).虽然我知道如何利用 BFC 解决这些问题, ...
- MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)
前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...
- 一行神奇的javascript代码
写本篇文章的缘由是之前群里@墨尘发了一段js代码,如下: (!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~ ...
- [翻译svg教程]Path元素 svg中最神奇的元素!
先看一个实例 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999 ...
- php isset( $test ) 的神奇之处。
很久一段时间没更新博客了,由于近段时间一直在忙 挑战杯 的项目,所以没怎样把一些总结放上来.这次,总结下 php 的一个 函数 : boolean isset($test), 返回值:boolean类 ...
- 神奇的CSS3按钮特效
点击这里查看效果 以下是源代码: <!doctype html> <html> <!-- author: @simurai --> <head> < ...
随机推荐
- .NET Core(.NET6)中gRPC注册到Consul
一.简介 上一篇文章介绍了.NET Core 中使用gRPC,在微服务中,我们通常要把服务做成服务注册,服务发现的方式,那么这里来说一下gRPC是如何注册到Consul中的. Consul的安装这里就 ...
- marginStart marginEnd就关于上述两个用法展开讨论
在我还在手动调整两个控件距离时,第一次见识到了marginStart marginEnd两个用法, 但是,只知道它俩能够调整控件距离,但是不知道具体用法,老师也没细说,就这样开启了我对于这两个用法&q ...
- input 标签的 pattern 属性
定义和用法 pattern 属性规定用于验证输入字段的模式. 模式指的是正则表达式. 注释:pattern 属性适用于以下 <input>类型:text, search, url, tel ...
- 从同步函数 hello-world-dotnet 开始探索OpenFunction
OpenFunction[1] 是一个现代化的云原生 FaaS(函数即服务)框架,它引入了很多非常优秀的开源技术栈,包括 Knative.Tekton.Shipwright.Dapr.KEDA 等,这 ...
- [游记] pkusc 2021 游记
流水账 Day-4 写了ICPC的一道DP,有点细节,虽然写得有点难受,但挺好玩 Day-3 写了PKUSC2018最水的一题 是随机开的题 Day-2 可以去pkusc了,从今天中午开始停课 刚吃完 ...
- CentOS 8 重启不能DHCP获取IP的解决方法
一个执着于技术的公众号 今天遇到一个神奇的现象,我对CentOS 8系统做初始化之后再重启系统,发现系统不能通过NetworkManager获取DHCP IP了 查了系统日志发现是: Apr 30 0 ...
- 定时 ——setTimeout | setInterval
使用场景,setTimeout 只调用一次,setInterval 会重复调用,直到清除或重载. <div id="countDown"></div> &l ...
- 零基础学Java第三节(基本输入输出)
本篇文章是<零基础学Java>专栏的第三篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号[编程攻略] Java程序的命令行参数 我们可以 ...
- Kafka 万亿级消息实践之资源组流量掉零故障排查分析
作者:vivo 互联网服务器团队-Luo Mingbo 一.Kafka 集群部署架构 为了让读者能与小编在后续的问题分析中有更好的共鸣,小编先与各位读者朋友对齐一下我们 Kafka 集群的部署架构及服 ...
- flex布局的总结
1.开启了flex布局的元素叫: flex container 2.里面的直接子元素叫:flex items(默认情况下,所有item都会在一行显示) 3.display属性由flex和inline- ...