bzoj1094[ZJOI2007]粒子运动 计算几何

1094: [ZJOI2007]粒子运动

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 658  Solved: 164
[Submit][Status][Discuss]

Description

  阿Q博士正在观察一个圆形器皿中的粒子运动。不妨建立一个平面直角坐标系,圆形器皿的圆心坐标为(x0, y0
),半径为R。器皿中有若干个粒子,假设第i个粒子在时刻0的位置为(xi, yi),速度为(vxi,vyi)(注:这是一个
速度向量,若没有发生碰撞,t时刻的位置应该是(xi + t * vxi, yi + t * vyi) )。假设所有粒子的运动互不干
扰;若某个粒子在某个时刻碰到了器皿壁,将发生完全弹性碰撞,即速度方向按照碰撞点的切线镜面反射,且速度
大小不变(如图)。认为碰撞是瞬间完成的。

  尽管碰撞不会影响粒子的速率,但是粒子却会受到一定的伤害,所以若某一个粒子碰撞了k次器皿壁,那么在
第k次碰撞时它便会消亡。 出于研究的需要,阿Q博士希望知道从时刻0到所有粒子都消亡这段时间内,所有粒子之
间的最近距离是什么。你能帮助他么?

Input

  第一行包含三个实数,分别为x0, y0, R,即圆形器皿的圆心坐标及半径。第二行包含两个正整数N, k,分别
表示粒子的总数与消亡碰撞次数。接下来N行每行四个实数,分别为xi, yi, vxi , vyi,保证(xi, yi)都在圆内且
(vxi, vyi)非零。

Output

  仅包含一个实数,即所有粒子的历史最近距离,精确到小数点后三位。

Sample Input

0 0 10
2 10
0 -5 0 1
5 0 1 0

Sample Output

7.071

HINT

 

  对于所有的数据,2 ≤N ≤100。1≤k ≤100。 请注意实数精度问题。

 

暴力枚举两个点,判断它们在每一时刻的最短距离
两个点的运动其实是分段的,每当一个点碰边就重新划分一段,最多可能有2*k段
每次碰边后重新计算路线,计算方式看这个博客http://blog.csdn.net/lych_cys/article/details/50785713

 

 1 #include<bits/stdc++.h>
 2 #define N 105
 3 using namespace std;
 4 int n,m,k;double t1,t2,r,c[N][N];
 5 struct point{
 6     double x,y;
 7     point operator + (const point &b)const{return (point){x+b.x,y+b.y};}
 8     point operator * (const double &b)const{return (point){x*b,y*b};}
 9     point operator - (const point &b)const{return (point){x-b.x,y-b.y};}
10 }o;
11 struct line{point p,v;}a[N][N];
12 double dot(point a,point b){return a.x*b.x+a.y*b.y;}
13 double crs(point a,point b){return a.x*b.y-a.y*b.x;}
14 double solve(int i,int j,int p1,int p2){
15     point v1=a[i][p1].v-a[j][p2].v,v2=(a[i][p1].p-a[i][p1].v*c[i][p1])-(a[j][p2].p-a[j][p2].v*c[j][p2]);
16     double u=dot(v1,v1),v=2*dot(v1,v2),w=dot(v2,v2),t;
17     if(!u){
18         if(v>0)t=t1;else t=t2;
19         return sqrt(w+t*v);
20     }
21     else{
22         t=-v/(2*u);
23         if(t<t1)t=t1;if(t>t2)t=t2;
24         return sqrt(t*t*u+v*t+w);
25     }
26 }
27 int main(){
28     scanf("%lf%lf%lf",&o.x,&o.y,&r);
29     scanf("%d%d",&n,&m);
30     double u,v,w,t;point p,q,nm;
31     for(int i=1;i<=n;i++){
32         scanf("%lf%lf%lf%lf",&a[i][0].p.x,&a[i][0].p.y,&a[i][0].v.x,&a[i][0].v.y);
33         for(int j=1;j<=m;j++){
34             p=a[i][j-1].p-o;q=a[i][j-1].v;
35             u=dot(q,q);v=dot(p,q)*2;w=dot(p,p)-r*r;
36             t=(sqrt(v*v-4*u*w)-v)/2/u;
37             c[i][j]=c[i][j-1]+t;
38             a[i][j].p=a[i][j-1].p+a[i][j-1].v*t;
39             nm=a[i][j].p-o;swap(nm.x,nm.y);nm.x=-nm.x;
40             a[i][j].v=nm*(dot(nm,a[i][j-1].v)/dot(nm,nm)*2)-a[i][j-1].v;
41             line tmp=a[i][j];
42             printf("%.2lf %.2lf %.2lf %.2lf\n",tmp.p.x,tmp.p.y,tmp.v.x,tmp.v.y);
43         }
44     }
45     double ans=1e10;int p1,p2;
46     for(int i=1;i<=n;i++)
47         for(int j=i+1;j<=n;j++){
48             p1=p2=0;
49             while(p1<m&&p2<m){
50                 t1=max(c[i][p1],c[j][p2]);
51                 t2=min(c[i][p1+1],c[j][p2+1]);
52                 ans=min(ans,solve(i,j,p1,p2));
53                 if(c[i][p1+1]<c[j][p2+1])p1++;
54                 else p2++;
55             }
56         }
57     printf("%.3lf\n",ans);
58     return 0;
59 }

 

转载于:https://www.cnblogs.com/wsy01/p/8177042.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux自动挂载磁盘命令,使用mount命令配置Linux自动挂载

使用mount命令来挂载硬件&#xff0c;在Linux重启后这些挂载信息会丢失&#xff0c;因此对应磁盘这类硬件&#xff0c;需要配置自动挂载来保证系统重启时进行自动挂载。自动挂载信息保存在文件/etc/fstab文件中查看该文件的数据&#xff1a;rootlocalhost dev]# cat /etc/fstab…

webview 防止js注入_天台县js聚合物水泥防水涂料的作用

天台县js聚合物水泥防水涂料的作用 2、JS防水涂料建筑胶粉与801建筑胶水的区别在哪?彩色聚氨酯防水涂料施工要点&#xff1a; 彩色聚氨酯防水涂料注意事项&#xff1a;1、材料必须按配比混合搅拌均匀&#xff0c;混合后的物料应在20分钟内用完。2、施工温度宜在5℃以上&#x…

10年老电脑如何提速_电脑越用越卡?如何简单升级,让你的旧笔记本瞬间提速...

很多人的笔记本电脑使用几年之后往往越来越卡&#xff0c;体验也随之下降。其实&#xff0c;很多时候你无需购置新品&#xff0c;对现有的电脑进行简单的配置升级就能让它提速&#xff0c;变得更为流畅&#xff0c;如果只是用于日常码字、办公&#xff0c;完全还能胜任&#xf…

linux服务器每次重启卡住,运维如何解决Linux服务器重启后命令无法正常使用的问题...

原标题&#xff1a;运维如何解决 Linux 服务器重启后命令无法正常使用的问题前提&#xff1a;在Linux系统中安装ASM&#xff0c;安装完ASM和Oracle数据库时都是正常使用的&#xff0c;但在重启服务器后Oracle相关命令不识别。1、截图如下&#xff1a;2、查看环境变量是否正常命…

web 三联发票针式打印_打印机共享操作,其实没想象的那么难

工作中桌面型的打印机一般是用USB直连一台主机&#xff0c;然后共享给其它电脑进行打印的&#xff0c;如&#xff1a;针式发票打印机、喷墨打印机等&#xff0c;这时就会涉及到一个打印机共享的操作&#xff0c;今天就跟大家分享下共享操作。共享操作&#xff1a;在主机安装好打…

linux网卡IO,浅谈Linux 网络 I/O 模型简介(图文)

1、介绍Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件)&#xff0c;对一个文件的读写操作会调用内核提供的系统命令&#xff0c;返回一个file descriptor(fd&#xff0c;文件描述符)。而对一个socket的读写也会有响应的描述符&#xff0c;称为socket fd(socket文…

win10远程桌面连接_如何正确选择WIN10系统版本,Windows10系统各版本之间的区别...

截至2020年&#xff0c;Windows 10的市场份额达到了54.62%&#xff0c;成为了Windows家庭中占比最高的成员。微软也于2020年初对Windows 7做了不再进行技术支持的声明&#xff01;毋庸置疑的是&#xff0c;Windows 10的系统会逐渐占有更多的比例&#xff0c;并且逐步取代现有的…

win10进程太多怎么优化_用过最好用的Win10优化软件,全方面优化和管理!

文 | Allen 主播 | 蓝儿喵本文首发&#xff1a;www.zylxb.comHi&#xff0c;大家好&#xff0c;欢迎来到&#xff1a;无优质&#xff0c;不分享&#xff01;搜罗君的藏宝阁&#xff1a;优搜罗(id&#xff1a;usouluo)&#xff0c;由于公众号改版&#xff0c;建议大家星标置顶…

vb.net怎么调用fastreport报表_财务分析-企业财务管理报表模板制作实现智能化的财务运营...

随着我国经济的不断发展&#xff0c;企业在市场环境中的竞争压力也越来越大&#xff0c;只有具备充足的活力和竞争力的企业才可以在竞争激烈的市场环境中处于不败之地。财务分析作为企业财务管理的重要手段之一&#xff0c;它能够为企业的一切财务活动提供必要的依据&#xff0…

linux编译ffmepg,在Ubuntu下编译FFmpeg

在之前&#xff0c;我们成功地使用mingwmsys在Windows平台下编译FFmpeg(见 http://www.linuxidc.com/Linux/2014-11/109839.htm)&#xff0c;并生成了ffplay.exe。现在再在Ubuntu平台上重新编译一次。相对于在Windows平台上编译需要的旷日持久而且异常艰难的工作&#xff0c;Ub…

C++为什么空格无法输出_47个快捷键、50个CAD技巧,终于知道为什么别人用CAD总比我快了!...

终于知道为什么别人用CAD总比我快了&#xff0c;原来他们早就掌握了这些实用的CAD技巧&#xff0c;还没看完我就默默地转了&#xff0c;总有用得到的时候。47个快捷键1. 创建直线的快捷方式是L空格2. 创建圆的快捷方式是C空格3. 创建圆弧的快捷方式是A空格4. 创建矩形的快捷方式…

Flume环境搭建_五种案例(转)

Flume环境搭建_五种案例 http://flume.apache.org/FlumeUserGuide.html A simple example Here, we give an example configuration file, describing a single-node Flume deployment. This configuration lets a user generate events and subsequently logs them to the con…

linux配置服务器超时退出,Linux下实现不活动用户登录超时后自动登出

摘要&#xff1a;方法一&#xff1a;通过修改.bashrc或.bash_profile文件来实现通过修改home目录下的.bashrc或.bash_profile文件...方法一&#xff1a;通过修改.bashrc或.bash_profile文件来实现通过修改home目录下的.bashrc或.bash_profile文件来实现。这两个文件选择其中一个…

只读属性怎么来的初值_设置Mysql表只读,关键时刻或许能救你一命

作为一名数据库运维人员&#xff0c;应该遇到过表记录被异常全表更新&#xff0c;这个时候该怎么办。作为Mysql数据库运维人员&#xff0c;第一反应&#xff0c;应该就是上报&#xff0c;然后联系开发人员&#xff0c;确认此表作用&#xff0c;然后再确定恢复方案。在这里举一个…

miui12怎么自定义开机动画_MIUI12正式发布:视觉/功能大升级

点击上方蓝字【安兔兔】关注我文章每天不断更&#xff01;在今天下午举行的线上发布上&#xff0c;小米正式发布了MIUI12系统。从官方描述来看&#xff0c;MIUI12可以说是MIUI近几年来最重磅的一次更新&#xff0c;在UI界面、动画以及功能等方面都作出了升级。按照官方说法&…

已触发了一个断点 vs_VSCode源码分析-断点调试

背景今年年初&#xff0c;有幸参与了阿里集团IDE 共建项目组&#xff0c;打造阿里生态体系内的公共IDE底层&#xff0c;而作为一款面向开发者的IDE&#xff0c;调试能力的支持一定程度上决定着一款IDE的开发体验&#xff1b;VSCode作为微软体系下一款当前最热的IDE开发工具&…

移动web——touch事件介绍

基本概念 1、在移动web端点击事件或者滑动屏幕、捏合等动作都是由touchstar、touchmove、touchend这三个事件组合在一起使用的 2、click事件在移动端会有0.2秒的延迟&#xff0c;下面是测试click在移动web端的延迟&#xff0c;最好在手机浏览器中测试 <script>window.onl…

如何计算一年总共有多少周_一年有几个周?怎么计算周数及闰年?

用这一年的天数除以7。因为一周有七天。分析过程如下&#xff1a;假设这一年是2018年&#xff0c;2018年是一个平年&#xff0c;因为2018/4504……2。平年的全年有365天&#xff0c;365752……1。由此可得2018年有52周多1天。扩展资料&#xff1a;闰年的计算方法&#xff1a;1、…

linux系统安装应用商店失败,在Deepin/UOS系统应用商店中安装KiCad失败的解决方法...

在Deepin/UOS系统应用商店中搜索并安装KiCad可能会提示安装失败&#xff0c;原因就是缺少必要的依赖包及KiCad的封装库文件。下面分享解决方法及附上Deepin系统安装KiCad5的方法。参考深度商店应用Inkscape、KiCad、MyPaint、中望CAD Linux预装版。解决方法在系统中通过终端执行…

linux ubantu扩展空间,ubuntu 扩展存储空间

今天解决了一个Ubuntu存储空间不足的问题。我在网上查了很多资料&#xff0c;都没有什么让我满意的方法。我是菜鸟级的用户&#xff0c;当然使用最菜的方法。以下是我的解决方案&#xff0c;供大家参考。方法步骤&#xff1a;第一步&#xff0c;在Ubuntu系统下&#xff0c;进入…