最近终于把《三体Ⅰ·地球往事》和《三体Ⅱ·黑暗森林》看完了!

为了快点认识题目中的歌者文明,已经开始第三部了!

题目背景

@FirstLight0521 出题人在这里哦~

三体人所居住的星系由于三体运动的不确定性而导致三体星人生活动荡不安,善良的人类程序员(也就是你了!伟大的英雄!)决定帮助愚蠢得连程序都不会写的三体星人模拟天体的运动轨迹。这时,无聊的“歌者”文明决定戏弄一下你,于是给三体星系添加了一些新的星体。

题目描述

输入 \(N\) 个天体与他们在空间中的坐标 \((xi,yi,zi)\) 、初速度 \((vx,vy,vz)\) 与质量 \(Mi\) ,已知三体世界受到“歌者”影响时间的流动不是连续的(每 \(0.01\) 秒钟刷新一次),天体均视为质点,求 \(t\) 时刻所有天体的坐标。

本题 \(G\) 取 \((6.67408×10^{-11})\) ,在代码中可以写成:

  1. #define G 6.67408e-11

当你的答案与标准答案的相对误差不超过 \(0.5%\) 的时候,你在本测试点得到AC。

也就是说,保留多少位小数你可以自行确定。

标准答案将会保留 \(12\) 位小数。本题开启 \(SPJ\) 判断你的答案是否正确。

输入格式

第一行输入天体数 \(N\) 与时刻 \(t\) ,接下来逐行输入以空格分隔的各天体坐标、质量与初速度(三个方向上的分速度)。

输出格式

\(N\) 行,每行为第 \(i\) 个天体在t时刻的坐标 \(xi,yi,zi\) ,空格隔开。

输入输出样例

输入 #1

3 100

0 10 0 10000000 0.006207480877613 0 0

8.660254037844 -5 0 10000000 -0.003103740438807 -0.00537583613352 0

-8.660254037844 -5 0 10000000 -0.003103740438807 0.00537583613352 0

输出 #1

0.620349511786 9.980741705470 0.000000000000

8.333401109655 -5.527609289167 0.000000000000

-8.953750621441 -4.453132416303 0.000000000000

输入 #2

3 100

0 10 0 10000000 0.06207480877613 0 0

8.760254037844 -5 0 10000000 -0.03103740438807 -0.0537583613352 0

-8.660254037844 -5 0 10000000 -0.03103740438807 0.0537583613352 0

输出 #2

6.204092324054 9.982347016794 0.000000000000

5.642963405596 -10.364100727695 0.000000000000

-11.747055729651 0.381753710901 0.000000000000

说明/提示

\(3 <= N <= 30\),\(0 <= T <= 100\)。初始坐标范围为 \([-100, 100]\) 。质量在 \(int64\) 范围内。

——————————————————————————————————————————

首先彻底理解题意比较重要,题目描述中有一句很关键的话:时间的流动不是连续的(每 \(0.01\) 秒钟刷新一次)

这就等于告诉我们了我们所研究的只是一个粗糙的三体模型,不需要考虑各数值在任意时刻的变化情况。

而只考虑每极短时间( \(0.01\) 秒)的变化,根据物理知识,变化量就是各行星的坐标、速度和加速度。

我们在某 \(0.01\) 秒开始之前首先计算所有行星间因为万有引力产生的加速度,

然后根据高中物理学的微元法,视每个 \(0.01\) 内都为匀速直线运动,依次更新行星速度和坐标。

为了方便计算,我们将所有的矢量正交分解,即可把在同方向上的影响直接相加。

公式推导过程如下:

万有引力公式:\(F=G\frac{M·m}{r^2}\),加速度 \(a=G\frac{M}{r^2}\)

接着通过下图的几何关系就可以算出加速度在某方向上的分量(三维也是同理)。

代码如下:

  1. #include <bits/stdc++.h>
  2. #define G 6.67408e-11
  3. using namespace std;
  4. int n;
  5. double t,t0=0.01;
  6. struct ball {
  7. double m,x,y,z,vx,vy,vz,ax,ay,az;
  8. void read() { scanf("%lf%lf%lf%lf%lf%lf%lf",&x,&y,&z,&m,&vx,&vy,&vz); }
  9. void pri() { printf("%.12lf %.12lf %.12lf\n",x,y,z); }
  10. }body[233];
  11. inline void along(int num) {
  12. body[num].ax=body[num].ay=body[num].az=0.0;
  13. for (int i=1;i<=n;i++) {
  14. double d2,px,py,pz;
  15. if (i==num) continue;
  16. px=body[i].x-body[num].x;
  17. py=body[i].y-body[num].y;
  18. pz=body[i].z-body[num].z;
  19. d2=px*px+py*py+pz*pz;
  20. //计算加速度的分量
  21. body[num].ax+=G*body[i].m/(d2*sqrt(d2))*px;
  22. body[num].ay+=G*body[i].m/(d2*sqrt(d2))*py;
  23. body[num].az+=G*body[i].m/(d2*sqrt(d2))*pz;
  24. }
  25. }
  26. int main() {
  27. scanf("%d%lf",&n,&t);
  28. for (int i=1;i<=n;i++) body[i].read();
  29. for (double now=0.00;now<=t;now+=t0) {
  30. //先全部更新计算完影响之后,再移动。
  31. for (int i=1;i<=n;i++) along(i);
  32. for (int i=1;i<=n;i++) {
  33. body[i].vx+=body[i].ax*t0;
  34. body[i].vy+=body[i].ay*t0;
  35. body[i].vz+=body[i].az*t0;
  36. body[i].x+=body[i].vx*t0;
  37. body[i].y+=body[i].vy*t0;
  38. body[i].z+=body[i].vz*t0;
  39. }
  40. }
  41. for (int i=1;i<=n;i++) body[i].pri();
  42. return 0;
  43. }

P3945 | 三体问题 (天体物理+计算几何)的更多相关文章

  1. ACM/ICPC 之 计算几何入门-叉积-to left test(POJ2318-POJ2398)

    POJ2318 本题需要运用to left test不断判断点处于哪个分区,并统计分区的点个数(保证点不在边界和界外),用来做叉积入门题很合适 //计算几何-叉积入门题 //Time:157Ms Me ...

  2. HDU 2202 计算几何

    最大三角形 Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  3. ACM 计算几何中的精度问题(转)

    http://www.cnblogs.com/acsmile/archive/2011/05/09/2040918.html 计算几何头疼的地方一般在于代码量大和精度问题,代码量问题只要平时注意积累模 ...

  4. hdu 2393:Higher Math(计算几何,水题)

    Higher Math Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. sdut 2603:Rescue The Princess(第四届山东省省赛原题,计算几何,向量旋转 + 向量交点)

    Rescue The Princess Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Several days ago, a b ...

  6. [知识点]计算几何I——基础知识与多边形面积

    // 此博文为迁移而来,写于2015年4月9日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vxaq.html 1.前言 ...

  7. POJ 1106 Transmitters(计算几何)

    题目链接 切计算几何,感觉计算几何的算法还不熟.此题,枚举线段和圆点的直线,平分一个圆 #include <iostream> #include <cstring> #incl ...

  8. TYVJ计算几何

    今天讲了计算几何,发几道水水的tyvj上的题解... 计算几何好难啊!@Mrs.General....怎么办.... 这几道题都是在省选之前做的,所以前面的Point运算啊,dcmp啊,什么什么的,基 ...

  9. 计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点

    平面最近点对,即平面中距离最近的两点 分治算法: int SOLVE(int left,int right)//求解点集中区间[left,right]中的最近点对 { double ans; //an ...

随机推荐

  1. ios--->NSNotificationCenter传值

    object实现 //在发送通知时设置object参数 [[NSNotificationCenter defaultCenter] postNotificationName:@"ThisIs ...

  2. Centos 7 最小化部署svn版本控制(svn协议)

    1.关闭selinux sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config sh-4.2# reboot 2.卸载防火墙 sh-4.2 ...

  3. 模块化系列教程 | 深入源码分析阿里JarsLink1.0模块化框架

    1. 概述 1.1 模块动态加载卸载主流程 2. 模块动态加载 2.1 模块加载源码分析 2.1.1 AbstractModuleRefreshScheduler 2.1.2 ModuleLoader ...

  4. discuz如何修改主题列表页增加最后发表用户调用

    首页有点问题,我觉得摘要实在太长了,我调整了一下 <!--{if is_array($group['lastpost'])}--> <a href="forum.php?m ...

  5. 【论文笔记系列】AutoML:A Survey of State-of-the-art (上)

    之前已经发过一篇文章来介绍我写的AutoML综述,最近把文章内容做了更新,所以这篇稍微细致地介绍一下.由于篇幅有限,下面介绍的方法中涉及到的细节感兴趣的可以移步到论文中查看. 论文地址:https:/ ...

  6. DD boost你值得拥有

    也不知道什么时候就被赶到这条路上来了,只听领导的一声令下,备份啊能不能在异地也存一份呀?? 啊?? 领导语重心长的说你看啊,我们这个备份是这个样子的 现在的南京的两个工厂备份要在对方留一份备份的存档, ...

  7. 《Head first设计模式》之观察者模式

    观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. 客户有一个WeatherData对象,负责追踪温度.湿度和气压等数据.现在客户给我们提了个 ...

  8. css常用元素通用样式表

    @charset "utf-8";html,body,a,h1,h2,h3,h4,h5,h6,p,a,b,i,em,s,u,dl,dt,dd,ul,ol,li,strong,spa ...

  9. 2014.1.21 DNS大事故(dns原理、网络封锁原理)

    1.21那天发生了什么,由1.21联想补充……  很多网站都上不去,域名解析都到了65.49.2.178这个IP地址 先科普,再深挖  dns查询类型 递归查询,迭代查询   DNS解析过程,这里使用 ...

  10. Thinkphp 前端视图输出日期时间戳自动转换为时间格式化年月日

    需求:实现文章创建按年,月,日归类,并如图格式显示. 2018 年 11 月 ( 1 篇文章 ) 24日: 你走了真好,不然总担心你要走 (130) 05 月 ( 1 篇文章 ) 12日: 后来的我们 ...