问题描述
试题编号: 202009-4
试题名称: 星际旅行
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
在一个 维欧几里得空间的宇宙中,小 A 打算完成一次星际旅行。

利用 维直角坐标系,宇宙中每个点的位置都可以用 维坐标来表示。其中,在宇宙中心的 点(未必是坐标系原点)处,有一个半径为 的超球体黑洞,任何物体若落入黑洞内部(不包括其表面)则无法逃脱。

小 A 选定了 个不在黑洞内部的点
,作为他星际旅行的目标。不会有两个点处于同一位置。

为了提前做好旅行规划,小 A 希望求出这 个点两两之间的最短曲线距离。同样地,这些曲线不能经过黑洞的内部。为了方便,你只需要输出每个点到其他 个点的距离之和。

输入格式
第一行两个整数 。

第二行一个整数 。

第三行 个整数,依次表示超球体黑洞的中心 的每一维坐标。

接下来 行,每行 个整数。第 行的各个整数依次表示点
的每一维坐标。

同一行内的多个整数之间用一个空格隔开。

输出格式
输出一共 行,每行一个实数。第 行表示第 个点(
)到其他所有点的最短曲线距离之和。

请以“整数部分、小数点、小数部分”的格式输出实数,并保留不少于 12 位小数结果。采用其他格式(如科学记数法)输出可能无法得分。

样例输入1
2 3
2
3 1
5 1
1 3
3 -2
Data
样例输出1
8.83711594354348
10.83711594354348
9.39104657990738
Data
样例1说明
如下图所示,圆 为二维平面上的黑洞,
为小 A 星际旅行的目标。

p7.jpg

通过在圆周上选择合适的点 ,可以证明,
曲线
分别为这三对点之间满足条件的最短曲线。
这些曲线的长度分别为 5.14159265358979, 5.69552328995369, 3.69552328995369。

样例输入2
3 8
1
0 0 0
0 0 1
0 1 0
1 0 0
1 1 1
-1 -1 0
-1 0 -1
0 -1 -1
-1 -1 -1
Data
样例输出2
14.12797001266400
14.12797001266400
14.12797001266400
17.90086240651788
13.95502966750398
13.95502966750398
13.95502966750398
14.99490548122857

这是一道几何题,只要认真分析就会发现题目本身不难。题目的测试点给出了三个维度,分别是2,3,100三个维度,乍一看维度超过三维我们人类就无法理解和感知了,其实无论是100维还是2维在数学上的处理是一样的(就本题而言)。我们以最简单的二维进行分析。
任意两个位置a,b和黑洞o的关系有以下三种:
1.a和b的连线不经过黑洞o,
o和a与b的连线的垂线h大于黑洞的半径r,这时点a和b的最短曲线距离就是a与b的直线距离(如下图所示)
要判断出现这种情况的条件,我们要先求出
高度h,可以先求出三角形oab的面积s,这里使用海伦-秦九韶公式求面积。边ab的长度为x,求出面积后,h=2*s/x.
求h的代码块如下:


```cppdouble x=sqrt(temp);  double p=(d[i]+d[j]+x)/2;double s=sqrt(p*(p-x)*(p-d[i])*(p-d[j]));//海伦-秦九韶公式double h=2*s/x;

故出现上述这种情况的条件时h>=r.
2.a与b的连线不经过黑洞o,但是a和b的延迟线经过黑洞o,此时a和b的最短曲线距离依旧时a与b的直线距离。
边oa的长度为d[i],边ob的长度为d[j],边ab的长度为x.
出现这种情况的条件时角oab为钝角或直角。
即d[i]*d[i]+d[j]d[j]<=xx;
相似的角oba为钝角或直角的情况也一样。

在程序中判断出现这两种情况的代码块如下:

if(h>=r||(x*x+d[i]*d[i]<=d[j]*d[j])||(x*x+d[j]*d[j]<=d[i]*d[i])){result[i][j]=result[j][i]=x;continue;}

3.a和b的连线经过黑洞o,如下图

其中o1为点a和黑洞的切点,o2为点b和黑洞的切点。
a和b的最短曲线距离为a o1+bo2+弧o1 o2,三段之和。
由余弦定理可求出角aob

 double angle1=acos((d[i]*d[i]+d[j]*d[j]-x*x)/(2*d[i]*d[j]));

再根据三角函数可求出角aoo1和角boo2.

double angle2=acos(r/d[i]);double angle3=acos(r/d[j]);

角aob减出角aoo1和角aoo2可得角o1 o o2记为angle.
则弧长o1 o2=angle*r.

 result[i][j]=result[j][i]=(angle1-angle2-angle3)*r+rd[i]+rd[j];

下面给出完整代码:

#include<bits/stdc++.h>
using namespace std;
const int N=100+5;
const int M=2000+5;
int n,m;
double o[N],r;
double p[M][N],result[M][M];
double d[M],rd[M];
int main()
{//freopen("moyun.txt","r",stdin);cin>>n>>m>>r;for(int i=1;i<=n;i++)cin>>o[i];for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)cin>>p[i][j];for(int i=1;i<=m;i++){double temp=0;for(int j=1;j<=n;j++){temp+=(p[i][j]-o[j])*(p[i][j]-o[j]);}d[i]=sqrt(temp);rd[i]=sqrt(d[i]*d[i]-r*r);}for(int i=1;i<=m;i++){for(int j=i+1;j<=m;j++){double temp=0;for(int k=1;k<=n;k++)temp+=(p[i][k]-p[j][k])*(p[i][k]-p[j][k]);double x=sqrt(temp);  double p=(d[i]+d[j]+x)/2;double s=sqrt(p*(p-x)*(p-d[i])*(p-d[j]));//海伦-秦九韶公式double h=2*s/x;if(h>=r||(x*x+d[i]*d[i]<=d[j]*d[j])||(x*x+d[j]*d[j]<=d[i]*d[i])){result[i][j]=result[j][i]=x;continue;}double angle1=acos((d[i]*d[i]+d[j]*d[j]-x*x)/(2*d[i]*d[j]));double angle2=acos(r/d[i]);double angle3=acos(r/d[j]);result[i][j]=result[j][i]=(angle1-angle2-angle3)*r+rd[i]+rd[j];}}for(int i=1;i<=m;i++){double sum=0;for(int j=1;j<=m;j++){if(i==j) continue;sum+=result[i][j];}printf("%.14f\n",sum);}return 0;
}

第二十次csp认证 第四题 星际旅行题解相关推荐

  1. python认证考试_Python入门习题(39)——CCF CSP认证考试真题:公共钥匙盒

    CCF CSP认证考试真题:共钥匙盒 问题描述 试题编号:201709-2 试题名称:公共钥匙盒 时间限制:1.0s 内存限制:256.0MB 问题描述 有一个学校的老师共用N个教室,按照规定,所有的 ...

  2. CCF CSP认证菜鸟刷题日志

    CCF CSP菜鸟刷题日志(c/c++) 本萌新写给自己看的,要是有大佬路过,请多多指教orz 立个flag:每日一更,至201903 9月15ccf csp,冲鸭! 今天(2019.8.18)起每天 ...

  3. CCF CSP认证历年真题 满分代码(持续更新中)

    目标 在接下来的半年到一年时间内,补全CCF认证历年真题(A-D)的满分代码(E题随缘). 考虑到CCF认证这个东西是可以混分的,我计划对D.E题额外增加部分分代码,或许有助于不同层次的选手备赛. 除 ...

  4. CSP认证201509-2 日期计算[C++题解]:枚举、模拟

    题目分析 来源:acwing 分析: 主要是判断2月多少天.然后就是遍历每个月,依次减去当前月的天数,发现days还剩多少天就是当月几号. 其实这里是背的模板,日期题模板更难一点的题目是 CSP认证 ...

  5. CSP认证历年真题题解 (Python)

    文章目录 此篇文章是小菜本菜使用Python做CCF-CSP的一些记录,希望能够以此帮助到正在为题目苦苦思考,但还没有找到解决思路的朋友们.诚然,这里的代码还有很多值得改进之处,希望各位码友不吝赐教. ...

  6. python认证考试有哪些_Python入门习题(19)——CCF CSP认证考试真题:中间数

    问题描述 试题编号:201703-1 试题名称:分蛋糕 时间限制:1.0s 内存限制:256.0MB 问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, ...

  7. 第23次CSP认证 第4题 收集卡牌(记忆化搜索,状压)

    链接:http://118.190.20.162/view.page?gpid=T132 思路:先写一个暴力搜索,然后把中间结点的状态存起来,就是记忆化搜索,状态要存搜索到的层数和选择的卡牌数,0代表 ...

  8. CSP认证201712-4 行车路线[C++题解]:单源最短路变型、拆点、好题!

    文章目录 题目解答 题目链接 题目解答 来源:acwing 分析: 题目给定所有答案不超过1e6,其实也就保证了连续小路的长度不超过1000(1000的平方就是1e6).这样我们就可以在题目给定的条件 ...

  9. CSP认证201612-3 权限查询[C++题解]:模拟题、结构体、set、有点复杂

    题目分析 来源:acwing 分析:这样的模拟题,主要难在建模,需要思考用什么来存储. 这里用一个结构体来存权限.用哈希表来存<角色,权限结构体>的映射,当然权限结构体存在set中,需要去 ...

最新文章

  1. 计算机视觉以及它在商业中是如何应用的?
  2. xp系统无法创建宽带连接服务器地址,XP下无法建立宽带拨号连接修复一例(新建连接向导选项为灰色)...
  3. Ubuntu12.04安装小记
  4. popupmenu java_Java基于JPopupMenu实现系统托盘的弹出菜单,解决PopupMenu弹出菜单中文乱码...
  5. html打印预览出现重叠,html – 使用打印模式css打印网页时页眉和正文内容重叠...
  6. 这些优化 Drupal 网站速度的超简单办法,你忽略了多少?
  7. tf.image.crop_and_resize()使用
  8. 微信小程序图片上传九宫格拖拽组件
  9. 区块链 以太坊 solidity 什么时候使用storage、memory
  10. 小学生应该学习编程语言
  11. 局域网联机_红警如何局域网联机?详细联机教程,方法特别简单
  12. 分类变量 哑变量矩阵 指标矩阵_ML基础:协方差矩阵
  13. Python彩色图片转成黑白图片
  14. Eventide插件夏季促销
  15. Pyghon学习记录
  16. SVM问题的求解方法SMO算法
  17. makefile和make
  18. 数组、链表、队列、栈数据结构特点,各自优点和缺点
  19. Android常见的错误及解决
  20. Adobe Illustrator软件安装下载

热门文章

  1. Int里-128到127的学问
  2. UltraEdit14.00b 注册码
  3. cscd期刊是c刊吗_cscd期刊和cssci级别哪个高
  4. ARM:植物微生物组的生态学与进化
  5. R语言:数量生态学学习笔记——doubs数据探索(1)
  6. [九度][何海涛] 矩形覆盖
  7. 2022-2028全球与中国移动网络电话(mVOIP)市场现状及未来发展趋势
  8. 雷军把小米发布会开到华为门口,发布了安卓版iPhone X
  9. 无法打开安装程序包....确认这是一个有效的windows installer程序包
  10. 作死十法:如何激怒一位3D建模师?“危”字警告