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
2 10
0 -5 0 1
5 0 1 0
Sample Output
HINT
对于所有的数据,2 ≤N ≤100。1≤k ≤100。 请注意实数精度问题。
暴力枚举两个点,判断它们在每一时刻的最短距离
两个点的运动其实是分段的,每当一个点碰边就重新划分一段,最多可能有2*k段
每次碰边后重新计算路线,计算方式看这个博客http://blog.csdn.net/lych_cys/article/details/50785713
#include<bits/stdc++.h>
#define N 105
using namespace std;
int n,m,k;double t1,t2,r,c[N][N];
struct point{
double x,y;
point operator + (const point &b)const{return (point){x+b.x,y+b.y};}
point operator * (const double &b)const{return (point){x*b,y*b};}
point operator - (const point &b)const{return (point){x-b.x,y-b.y};}
}o;
struct line{point p,v;}a[N][N];
double dot(point a,point b){return a.x*b.x+a.y*b.y;}
double crs(point a,point b){return a.x*b.y-a.y*b.x;}
double solve(int i,int j,int p1,int p2){
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]);
double u=dot(v1,v1),v=*dot(v1,v2),w=dot(v2,v2),t;
if(!u){
if(v>)t=t1;else t=t2;
return sqrt(w+t*v);
}
else{
t=-v/(*u);
if(t<t1)t=t1;if(t>t2)t=t2;
return sqrt(t*t*u+v*t+w);
}
}
int main(){
scanf("%lf%lf%lf",&o.x,&o.y,&r);
scanf("%d%d",&n,&m);
double u,v,w,t;point p,q,nm;
for(int i=;i<=n;i++){
scanf("%lf%lf%lf%lf",&a[i][].p.x,&a[i][].p.y,&a[i][].v.x,&a[i][].v.y);
for(int j=;j<=m;j++){
p=a[i][j-].p-o;q=a[i][j-].v;
u=dot(q,q);v=dot(p,q)*;w=dot(p,p)-r*r;
t=(sqrt(v*v-*u*w)-v)//u;
c[i][j]=c[i][j-]+t;
a[i][j].p=a[i][j-].p+a[i][j-].v*t;
nm=a[i][j].p-o;swap(nm.x,nm.y);nm.x=-nm.x;
a[i][j].v=nm*(dot(nm,a[i][j-].v)/dot(nm,nm)*)-a[i][j-].v;
line tmp=a[i][j];
printf("%.2lf %.2lf %.2lf %.2lf\n",tmp.p.x,tmp.p.y,tmp.v.x,tmp.v.y);
}
}
double ans=1e10;int p1,p2;
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++){
p1=p2=;
while(p1<m&&p2<m){
t1=max(c[i][p1],c[j][p2]);
t2=min(c[i][p1+],c[j][p2+]);
ans=min(ans,solve(i,j,p1,p2));
if(c[i][p1+]<c[j][p2+])p1++;
else p2++;
}
}
printf("%.3lf\n",ans);
return ;
}
bzoj1094[ZJOI2007]粒子运动 计算几何的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 【ZJOI2007】粒子运动
若此段起始点为(stx,sty),速度为(vx,vy),设碰撞时间为t,则(stx+vx·t)²+(sty+vy·t)²=r² → stx²+vx²·t²+2·stx·vx·t+sty²+vy²·t² ...
- ACM/ICPC 之 计算几何入门-叉积-to left test(POJ2318-POJ2398)
POJ2318 本题需要运用to left test不断判断点处于哪个分区,并统计分区的点个数(保证点不在边界和界外),用来做叉积入门题很合适 //计算几何-叉积入门题 //Time:157Ms Me ...
- HDU 2202 计算几何
最大三角形 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)
题目链接: 1096: [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L ...
- BZOJ 1096: [ZJOI2007]仓库建设 [斜率优化DP]
1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4201 Solved: 1851[Submit][Stat ...
- ACM 计算几何中的精度问题(转)
http://www.cnblogs.com/acsmile/archive/2011/05/09/2040918.html 计算几何头疼的地方一般在于代码量大和精度问题,代码量问题只要平时注意积累模 ...
- hdu 2393:Higher Math(计算几何,水题)
Higher Math Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- sdut 2603:Rescue The Princess(第四届山东省省赛原题,计算几何,向量旋转 + 向量交点)
Rescue The Princess Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 Several days ago, a b ...
随机推荐
- 从PRISM开始学WPF(二)Prism?
目录: 从PRISM开始学WPF(一)WPF? 从PRISM开始学WPF(二)Prism? 从PRISM开始学WPF(三)Prism-Region? 从PRISM开始学WPF(四)Prism-Modu ...
- PHP trait
ps:由于PHP是单继承的,无法继承多个类所以可以用triat(关键字,特性)来命名达到子类继承多个父类的效果:暂且理解为类吧.class = trait <?php trait A { pub ...
- JAVA中的Log4j
Log4j的简介: 使用异常处理机制==>异常 使用debug调试(必须掌握) System.out.Print(); 001.控制台行数有限制 002.影响性能 ...
- SLF4J - 一个允许你统一日志记录API的抽象层
一.什么是SLF4J 我们在做Java开发时,如果需要记录日志,有很多日志API可供选择,如: java.util.logging Apache log4j logback SLF4J又是个什么东东呢 ...
- OrientDB入门(1)Getting Started
Running OrientDB the First Time First, download and extract OrientDB by selecting the appropriate pa ...
- Spring Security入门(1-12)Spring Security 的过滤器机制
Servlet过滤器被用来拦截用户请求来进行请求之前或之后的处理,或者干脆重定向这个请求,这取决于servlet过滤器的功能. Servlet过滤器处理之后的目标servlet是 MVC 分发web ...
- SpringBoot实现多环境配置
1.为什么需要配置多环境配置 在实际的开发中,我们往往需要在不同的环境中使用不同的数据库.缓存配置,如果使用同一套配置文件,在不同环境部署的时候手动去修改配置文件,会使部署变得很繁琐.使用多环境配置文 ...
- Python/MySQL(二、表操作以及连接)
Python/MySQL(二.表操作以及连接) mysql表操作: 主键:一个表只能有一个主键.主键可以由多列组成. 外键 :可以进行联合外键,操作. mysql> create table y ...
- geotrellis使用(三十七)COG 基础介绍
前言 Geotrellis 已经迭代到了 2.0 版本(截止写作此文时为 2.0.0-SNAPSHOT 版),2.0 版多了很多新的特性,其中最重要的应该就是 COG,COG 是什么鬼?刚看到时我也是 ...
- PIL绘图
# coding:utf-8 # PIL的ImageDraw 提供了一系列绘图方法,让我们可以直接绘图.比如要生成字母验证码图片 from PIL import Image, ImageDraw, I ...