2013 ACM区域赛长沙 C Collision HDU 4793
题意:在平面上0,0点,有一个半径为R的圆形区域,并且在0,0点固定着一个半径为RM(<R)的圆形障碍物,现在圆形区域外x,y,有一个半径 为r的,并且速度为vx,vy的硬币,如果硬币碰到了障碍物,将会保持原有的速度向反射的方向继续前进,现在给出R,RM,r,x,y,vx,vy,问硬币的任意部分在圆形区域中滑行多少时间?
思路:首先把R,RM加上r,就可以把硬币看做一个点来讨论了,然后算一下射线与这两个圆交点的个数,记作C1,C2,CM1,CM2,若与两个圆的交点数都是2,答案就是dis(c1,c2)-dis(cm1,cm2)之后再除以合成后的速度,若与大圆的交点数为2,小圆的交点数是0或者1,答案就是 dis(c1,c2)/速度,否则肯定是0了.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
typedef long long ll; int dcmp(double x) {
return (x>eps)-(x<-eps);
} typedef struct Point {
double x, y;
Point(double x = , double y = ) : x(x), y(y) {}
Point operator+(const Point& p) const {
return Point(x+p.x, y+p.y );
}
Point operator-(const Point& p) const {
return Point(x-p.x, y-p.y );
}
Point operator*(const double d) const {
return Point(x*d, y*d );
}
Point operator/(const double d) const {
return Point(x/d, y/d );
}
void read() {
scanf("%lf%lf", &x, &y);
}
} Vector; inline double Dis(const Point& a, const Point& b) {
return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
} struct Line {
Point P;
Vector v;
double ang;
Line() {}
Line(const Point& P, const Vector& v):P(P),v(v) {
ang = atan2(v.y,v.x);
}
bool operator<(const Line& L) const {
return ang<L.ang;
}
Point point(double t) {
return P+v*t;
}
}; struct Circle {
Point c;
double r;
Circle() {}
}; int GetLineCircleIntersection(Line L, Circle C, double &t1, double &t2, vector<Point> &sol) {
double a = L.v.x, b = L.P.x-C.c.x, c = L.v.y, d = L.P.y - C.c.y;
double e = a*a+c*c, f = *(a*b+c*d), g = b*b+d*d-C.r*C.r;
double delta = f*f-*e*g;
if(dcmp(delta)<) return ;
if(dcmp(delta)==) {
t1 = t2 = -f/(*e);
sol.push_back(L.point(t1));
return ;
}
t1 = (-f-sqrt(delta))/(*e);
sol.push_back(L.point(t1));
t2 = (-f+sqrt(delta))/(*e);
sol.push_back(L.point(t2));
if(dcmp(t1)< || dcmp(t2)<) return ;
return ;
} double R,RM,r,x,y,vx,vy;
int n,m,k; int main() {
// freopen("in.txt","r",stdin);
while(~scanf("%lf%lf%lf%lf%lf%lf%lf",&RM,&R,&r,&x,&y,&vx,&vy)) {
Line l1(Point(x,y),Point(vx,vy));
Circle c1,c2;
c1.r=RM+r;
c1.c.x=c1.c.y=0.0;
c2.c.x=c2.c.y=0.0;
c2.r=R+r;
double db1=0.0,db2=0.0;
vector<Point> crs1;
vector<Point> crs2;
int num2=GetLineCircleIntersection(l1,c1,db1,db2,crs2);
int num1=GetLineCircleIntersection(l1,c2,db1,db2,crs1);
// printf("num1:%d num2:%d\n",num1,num2);
double len=0.0,ans=0.0;
double vv=sqrt(vx*vx+vy*vy);
if (num1== && num2==) {
len=Dis(crs1[],crs1[])-Dis(crs2[],crs2[]);
printf("%.4lf\n",len/vv);
} else if (num1==) {
len=Dis(crs1[],crs1[]);
printf("%.4lf\n",len/vv);
} else {
printf("0.0000\n");
}
}
return ;
}
2013 ACM区域赛长沙 C Collision HDU 4793的更多相关文章
- 2013 ACM区域赛长沙 H zoj 3733 (hdu 4798) Skycity
题意:一个圆台,底面和顶面半径分别为R,r,然后高度为H,一共F层,每层高度一样,然后要在每层的天花板上贴方格玻璃,方格玻璃要满足以下几个条件: 方格玻璃面积不能小于S,且方格玻璃要围成一个正多边形, ...
- 2013 ACM区域赛长沙 A Alice’s Print Service HDU 4791
题意:就是一个打印分段收费政策,印的越多,单张价格越低,输入需要印刷的数量,求最小印刷费用一个细节就是,比当前还小的状态可能是最后几个. #include<stdio.h> #includ ...
- 2013 ACM区域赛长沙 K Pocket Cube hdu 4801
题意:给了一个2*2的魔方..每步操作可以将任意一面翻转90度..现在问在N(<=7)步内.最多能翻出几面相同的. 直接打表模拟每种翻转情况 #include<cstdio> #in ...
- 2013 ACM区域赛长沙 I LIKE vs CANDLE(ZOJ3734) 很好的一道树形DP
题意:一棵有根树,每个节点都有一个value值和属性(zan或是 CANDLE).你可以通过反转一些点的属性,反转一个点时候,它的整个子树都会被反转属性.有些点反转消耗代价为X,有些为Y.你的目标的是 ...
- 2013亚洲区域赛长沙站 ZOJ 3732 Graph Reconstruction
题目链接 Graph Reconstruction 题意 给你无向图每个点的度数, 问是否存在唯一解, 存在输出唯一解, 多解输出两个, 无解输出IMPOSSIBLE 思路 这里用到了 Havel-H ...
- 【2013南京区域赛】部分题解 hdu4802—4812
上周末打了一场训练赛,题目是13年南京区域赛的 这场题目有好几个本来应该是我擅长的,但是可能是太久没做比赛了各种小错误代码写的也丑各种warusn trush搞得人很不爽 全场题之一的1002也没有想 ...
- 第一次参加acm区域赛
什么,这周天就要去参加acm焦作赛,简直不敢相信.从大一暑假七月份中旬到今天十一月23日,加入acm将近四个多月的时间,如今到了检验自己的时候了.aaaaaaaaaa.乌拉,必胜.打印个模板,在跑个步 ...
- 2013区域赛长沙赛区现场赛 K - Pocket Cube
K - Pocket Cube Time Limit:10000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Su ...
- 2017 ACM区域赛(西安) 参赛流水账
day 0: 周五, 鸽了概统课,早上和紫金港的几位小伙伴一起打车去萧山机场,从咸阳机场到西北工业大学坐了五十多个站的公交车,感觉身体被掏空.晚上在宾馆本来打算补之前训练的一个题,想想还是先花个十来分 ...
随机推荐
- 九度OJ 1066 字符串排序
题目地址:http://ac.jobdu.com/problem.php?pid=1066 题目描述: 输入一个长度不超过20的字符串,对所输入的字符串,按照ASCII码的大小从小到大进行排序,请输出 ...
- HTML 表单和表格
1.使用表单标签 网站使用 HTML 表单可与用户进行交互,表单元素是允许用户在表单中输入内容,比如:文本框.文本域.单选框.复选框.下拉列表.按钮等等,表单可以把浏览者输入的数据传送到服务器端,这样 ...
- "position:relative"在IE中的Bug
当子元素过高导致父元素出现滚动条时,它并不会像预期的那样呆在父元素里,而是浮在父元素之上,并且位置不随滚动条的移动而改变.根源就是子元素的"position:relative".目 ...
- 由 OR 引起的死循环
在客商迁移测试时,程序一旦开始执行就不能自动停止.只能通过手动中断应用服务器的进程来停止.检查迁移的一个表,这个表迁移前没有数据,迁移最多会插入3w条左右数据,但是迁移过程执行2个多小时候再看,已经有 ...
- sql server2005主从数据库同步配置
网站规模到了一定程度之后,该分的也分了,该优化的也做了优化,但是还是不能满足业务上对性能的要求:这时候我们可以考虑使用主从库.主从库是两台服务器上的两个数据库,主库以最快的速度做增删改操作+最新数据的 ...
- linq 动态排序
/// <summary> /// 排序 /// </summary> /// <typeparam name="T"></typepar ...
- 单片微机原理P0:80C51结构原理
本来我真的不想让51的东西出现在我的博客上的,因为51这种东西真的太low了,学了最多就所谓的垃圾科创利用一下,但是想一下这门课我也要考试,还是写一点东西顺便放博客上吧. 这一系列主要参考<单片 ...
- [转]JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解
[转] JAVA环境变量JAVA_HOME.CLASSPATH.PATH设置详解 - dreamman的日志 - 网易博客http://blog.163.com/dreamman_yx/blog/st ...
- python的特殊方法:
__str__和__repr__ 如果要把一个类的实例变成 str,就需要实现特殊方法__str__(): class Person(object): def __init__(self, name, ...
- python中的字典(dict),列表(list),元组(tuple)
一,List:列表 python内置的一种数据类型是列表:list.list是一种有序的数据集合,可以随意的添加和删除其中的数据.比如列出班里所有的同学的名字,列出所有工厂员工的工号等都是可以用到列表 ...