[编程|1500分] 神奇盘子

时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++ 262144K,其他语言 524288K
Special Judge,64bit IO Format: %lld

题目描述

有一个神奇的盘子,形状为圆形。盘子上面爬着一个大象(视作一个点)。由于现实的扭曲,当大象在盘子某个直径的一端的时候,可以瞬间传送至直径的另一端。现在大象想去盘子上另外一点,问他最少需要移动多少距离。传送不计距离。

输入描述:

第一行一个整数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

代码 (之前的代码只跑了77.42%,更新了代码)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=1e6+10;
double esp=1e-6;
double r,x11,y11,x22,y22;
double pi=acos(-1.0);
double dist(double x1,double y1,double x2,double y2)
{return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main()
{while(cin>>r>>x11>>y11>>x22>>y22){double ans=dist(x11,y11,x22,y22);double x,y;for(double i=0;i<=pi;i+=0.000001){x=r*cos(i),y=r*sin(i);//cout<<x<<" "<<y<<endl;ans=min(ans,dist(-x,-y,x11,y11)+dist(x,y,x22,y22));ans=min(ans,dist(x,y,x11,y11)+dist(-x,-y,x22,y22));}printf("%.15f\n",ans);}return 0;
}

另附官方题解

思路

把一个点(x,y)翻到(-x,-y),就可以把题意转换为在圆周上求一个点,使得这个点到起点
与终点的距离和最小。直接三分角度或二分导数就可以了。时间复杂度为O(nm)。

#include<bits/stdc++.h>
using namespace std;
typedef long double D;
D pi = acos(-1.);
D eps = 1e-8;
inline int sign(const D & x) {return (x > eps) - (x + eps < 0);
}
struct P {D x, y;void scan() {double _x, _y;scanf("%lf%lf", &_x, &_y);x = _x; y = _y;}D sqrlen() const {return x * x + y * y;}D len() const {return sqrt(max((D)0., sqrlen()));}P operator + (const P & b) const {return P{x + b.x, y + b.y};}P operator - (const P & b) const {return P{x - b.x, y - b.y};}D operator % (const P & b) const {return x * b.x + y * b.y;}D operator * (const P & b) const {return x * b.y - y * b.x;}P zoom(const D & l) const {D lambda(l / len());return P{lambda * x, lambda * y};}void print() const {printf("%.12f %.12f\n", (double)x, (double)y);}
};
D atan2(const P & x) { return atan2(x.y, x.x); }
P operator * (const D & x, const P & a) { return P{x * a.x, x * a.y}; }
int main() {int r;scanf("%d", &r);P a, b;a.scan(); b.scan();D ans((a - b).len());b = -1. * b;if(sign(a * b) == 0) {ans = min(ans, 2 * r - ans);}else {D t1 = atan2(a), t2 = atan2(b);if(t1 > t2) swap(t1, t2), swap(a, b);if(t2 - t1 > pi) t1 += pi, swap(t1, t2), swap(a, b);D le = t1, ri = t2;for(int i(0); i < 1000; i++) {D mid((le + ri) / 2);P p = r * P{cos(mid), sin(mid)};//p.print();if(((p - a).zoom(1) - (p - b).zoom(1)) % (p - P{0, 0}) > 0) {le = mid;}else ri = mid;}P p = r * P{cos(le), sin(le)};ans = min(ans, (p - a).len() + (p - b).len());}printf("%.12f\n", (double)ans);}

2018codeM美团初赛B轮 4.神奇盘子相关推荐

  1. CodeM2018美团 初赛A轮 题目二 下棋

    CodeM2018美团 初赛A轮 题目二 下棋 [编程|1000分] 下棋 时间限制:C/C++ 1秒,其他语言 2秒 空间限制:C/C++ 262144K,其他语言 524288K 64bit IO ...

  2. CodeM美团2018初赛A轮 题目一

    CodeM美团2018初赛A轮 题目一 描述 小美想要在电视上看电影,我们知道在电视上搜索电影可以通过搜索电影名字首字母缩写得到,通过首字母搜索电影的界面由一个九宫格组成,如下图: 光标初始在这个九宫 ...

  3. CodeM2018 初赛A轮 第1,2题

    CodeM2018 初赛A轮 今晚参加了CodeM2018初赛A,结果只做对了两题-- 第1题:求一段字符串对应手机按键移动最少次数. 送分题非常简单,我的解法是一个数组保存A-Z的按键,一个二维数组 ...

  4. 2021年CSP-J入门级初赛(第一轮)真题讲解

    2017年NOIP普及组初赛真题讲解 2017年NOIP普及组初赛真题讲解_哔哩哔哩_bilibili 2018年NOIP普及组初赛真题讲解 2018年NOIP普及组初赛真题讲解_哔哩哔哩_bilib ...

  5. 【CodeM初赛B轮】A 贪心

    [CodeM初赛B轮]A 题目大意:给你一棵树,起初所有点都是白色的,你每次都能选择一个白点i,将这个点i到根路径上的所有到i的距离<k[i]的点都染成黑色(根和i也算,已经被染成黑色的点还是黑 ...

  6. 2018 CodeM初赛B轮:D.神奇盘子

    链接:https://www.nowcoder.com/acm/contest/151/D 来源:牛客网 题目描述 有一个神奇的盘子,形状为圆形.盘子上面爬着一个大象(视作一个点).由于现实的扭曲,当 ...

  7. 牛客网-2018 美团 CodeM 编程大赛-初赛 A 轮

    ACM模版 这场比赛没有晋级,以为没有好好打--我又在找借口.下午去办入职体检,比赛开始时还在回来路上,回到宿舍的时候就剩下半个小时了,签了一下到就没时间了.赛后发现第三题很有意思,就补了补-- 1- ...

  8. CodeM美团点评编程大赛初赛A轮 B.合并回文子串【区间Dp】

    [编程题] 合并回文子串 时间限制:2秒 空间限制:262144K 输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变.如"abc"和"xyz&qu ...

  9. CodeM美团点评编程大赛 初赛B轮 A 黑白树 贪心 E 子串 暴力

    A题类似想到给多个区间,求最少多少个区间可以覆盖全部的问题,求法就是从当前这步能够到达的区间里,选一个下一步能到的最大值,对于本题,区别一是树形结构,不是一维的直线了,区别二是点都是连续的,不是离散的 ...

最新文章

  1. svn清理失败且乱码 问题解决(转)
  2. Html-Css 从入门到放弃(一)基础知识
  3. 雷林鹏分享:Ruby XML, XSLT 和 XPath 教程
  4. CSS3实战开发:使用CSS3实现photoshop的过滤效果
  5. python使用MySQL数据库
  6. python 列表生成式_python 列表生成式 List Comprehensions
  7. CodeForces - 1058A. In Search of an Easy Problem
  8. javaEE项目部署方式
  9. Easyspy网络检测系统
  10. Vant 1.0 发布:轻量、可靠的移动端 Vue 组件库
  11. 不用掉一根头发!用 Flutter + Dart 快速构建一款绝美移动 App
  12. python计算空类型_python的变量 类型和存储
  13. ini文件中文乱码 python_用心盘Python:中文文件处理早晚会用到的将中文转成拼音...
  14. 最好用的 3 个 Windows EPUB 阅读器推荐
  15. java IDEA 打包发布
  16. 中文ASCII码对照表
  17. 推荐我看过的几本好书给大家
  18. wps表格l制作甘特图_如何制作甘特图(横道图)
  19. Au 效果器详解:自适应降噪
  20. Linux系列 使用vi文本编辑器

热门文章

  1. USB4Dock,USB4扩展坞方案 介绍
  2. 盛世昊通以产业数字化赋能高质量发展
  3. php链接mysql 老是die_php连接MySQL时, 为什么die(错误信息: . $conn-connect_error) 不返回错误信息?...
  4. 计算机d盘d桌面不见了,计算机D驱动器中的文件夹自动消失. 我没有隐藏或删除它. 我为什么找不到它?...
  5. ios dat 文件读写_树莓派安装Samba服务,实现家庭文件共享
  6. (转)工作是一种本能?
  7. 2022.3.1总结
  8. foxmail for linux 64,foxmail server 1.2 for linux数据备份手册_邮件服务器
  9. [附源码]计算机毕业设计基于springboot的高校资源共享平台
  10. 大学三年积累的教学资源分享和推荐!