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

bzoj1094[ZJOI2007]粒子运动 计算几何相关推荐

  1. 开源造轮子:一个简洁,高效,轻量级,酷炫的不要不要的canvas粒子运动插件库...

    一:开篇 哈哈哈,感谢标题党的莅临~ 虽然标题有点夸张的感觉,但实际上,插件库确实是简洁,高效,轻量级,酷炫酷炫的咯.废话不多说,先来看个标配例子吧: (codepen在线演示编辑:http://co ...

  2. AcWing 2984. 线段 / POJ3304(计算几何、常用技巧转换)

    常用技巧转换,寻找一个直线旋转 我们发现如果可以找到一个直线与所有的线段都相交,那么我们做一个垂直这个直线的垂线,所有的线段的投影一定都交于这个直线与垂线的垂足处,我们可以很轻松地画图验证这一定理. ...

  3. 模板 -计算几何注意事项

    整理的算法模板合集: ACM模板 目录 计算误差 解决方案 : 误差判别法 解决方案:化浮为整 注意负零 注意反三角函数的值域 计算几何常用开头模板 在写计算几何的题目的时候一般习惯数组从0开始(至少 ...

  4. 二维几何基础大合集!《计算几何全家桶(一)》(基础运算、点、线、多边形、圆、网格)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的模板整合计划 目录 1.基本运算 1.1 判断正负函数(sgn) 1.2 点积(数量积.内积)(Dot) 1.3 向量积 ...

  5. 【第一道计算几何题】 UVA11178 Morley‘s Theorem (二维几何,旋转直线求求交点)

    整理的算法模板合集: ACM模板 要求D点我们只需要把直线BC向左旋转a/3,向右旋转b/3得到两直线求交点即可. 秒啊秒啊 解锁技能树--计算几何,终于能加一个计算几何版块了 #include< ...

  6. 【计算几何】【分类讨论】Gym - 101173C - Convex Contour

    注意等边三角形的上顶点是卡不到边界上的. 于是整个凸包分成三部分:左边的连续的三角形.中间的.右边的连续的三角形. 套个计算几何板子求个三角形顶点到圆的切线.三角形顶点到正方形左上角距离啥的就行了,分 ...

  7. 【BZOJ 1095】 1095: [ZJOI2007]Hide 捉迷藏 (括号序列+线段树)

    1095: [ZJOI2007]Hide 捉迷藏 Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游 ...

  8. hdu 1174:爆头(计算几何,三维叉积求点到线的距离)

    爆头 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  9. 也许是史上最不良心的低阶计算几何讲解和习题集??

    -3.在此声明: 笔者极端厌恶计算几何,以至于直到今天之前都只打过几个计算几何的模板~~~~~ 不过鉴于今年是18年,所以感觉SD很有可能考计算几何(18年是什么理由啊喂) 于是滚过来整理计算几何的资 ...

最新文章

  1. 2021年大数据常用语言Scala(十五):基础语法学习 元组  重点掌握
  2. Java中System.getProperty()的参数
  3. 泛型(派生子类,泛型通配符,类型擦除)
  4. linux禁止客户端上传文件_实战 FastDFS Java 客户端上传文件
  5. spring中的jdk动态代理(代码步骤)
  6. 版本名称GA的含义:SNAPSHOT-alpha-beta-release-GA
  7. Java私有构造函数不能阻止继承
  8. 推荐曹济的FPA培训课程
  9. 李牛(Linux)打包
  10. 点击按钮弹出iframe_WEB安全(四) :CSRF与点击劫持
  11. python函数基本概念_python——函数的基本概念
  12. 智能家居告别荒蛮:机会与挑战并存
  13. jQuery实现左移右移
  14. 谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
  15. 七周成为数据分析师 第五周:Mysql
  16. AS 导出aar给Unity出打包出现Unable to merge android manifests
  17. 记一次CTF过程(Writeup)
  18. NXP-MPC5748G车载MCU使用(食用)方法(踩坑)实用指南(骗人教程)(二):使用FREERTOS点亮LED
  19. OPC基本知识介绍——什么是OPC
  20. 罗振宇2022“时间的朋友”跨年演讲全文稿(pdf)

热门文章

  1. 阿里云设置域名解析到主机ip
  2. designer一直未响应 qt_未雨绸缪及时清淤 曾是内涝重灾区 这次涵洞未积水
  3. python中if有几种使用方式_python 中if-else的多种简洁的写法
  4. 普通树与二叉树的相互转化及哈夫曼树的了解
  5. NHibernate教程(5)--CRUD操作
  6. Hexo自定义页面的方法
  7. 监测ASP.NET MVC 网站
  8. 【转】电脑GPS导航软件下载,教你把笔记本做成GPS
  9. sqlserver关键字
  10. Android 倒计时——Timer和CountDownTimer的使用,实现启动,暂停,继续,重复,重设时长以及启动service后台倒计时