XMU 1071 圣斗士黄金十二宫(七)银河星爆 【计算几何】
1071: 圣斗士黄金十二宫(七)银河星爆
Time Limit: 500 MS Memory Limit: 64 MB
Submit: 193 Solved: 10
[Submit][Status][Web Board]Description
撒加回答了星矢的第一个问题,但是当星矢要问第二个问题时,撒加的头发全变白了。白撒加的实力是无人能及的,星矢被废去了五感。这时帮沙加统计完单词的一辉也赶到了,想打赢白撒加是不可能的,一辉的目标就是争取时间让星矢拿到铜盾。为了尽快打倒被称为不死鸟的一辉,撒加也使出生平绝技---即使是星星被击中也要粉碎的银河星爆。
从撒加放出银河星爆到银河星爆接近一辉需要一段时间,在这段时间里一辉可以朝任何方向移动k单位的距离来躲开银河星爆。银河星爆的横截面为一个圆形,显然一辉在与横截面平行的平面上移动可以以最大的概率躲过。在该平面上建立直角坐标系横轴为x纵轴为y,银河星爆的横截面圆心坐标为(x1, y1),半径为R1。
把一辉也当成一个圆,他在坐标系上朝任意方向移动的最大距离为k,考虑到地形因素和一辉个人能力,一辉所能移动到的点(x , y)需满足0 <= x <= 1000 , 0 <= y <= 1000。如果两个圆不相交则说明一辉躲过了银河星爆(注意两圆外切也说明一辉躲过了)。
现在请您预测一辉能否有可能躲过撒加的银河星爆。Input
第一行为三个整数x1, y1, R1,代表银河星爆的圆心坐标和半径,其中0<= x1, y1 <= 1000, 0 < R1 <= 300。
第二行为三个整数x2, y2, R2,代表一辉的圆心坐标和半径,其中0 <= x2, y2 <= 1000, 0 < R2 <= 30。
第三行为一个正整数k <= 2000 表示一辉可以移动的最长距离。Output
如果一辉可以躲过银河星爆则输出"Yes",否则输出"No"(不包含引号)。
Sample Input
900 900 250
950 950 30
316Sample Output
Yes
HINT
Source
题目链接:
http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1071
题目大意:
一个炸弹,坐标(X1,Y1),爆炸半径R1,一个人,坐标(X2,Y2),视为球体半径R2,人最多移动距离为K,问能否躲过炸弹且圆心不超出边界。(外切或相离)
题目思路:
【计算几何】
首先将人的体积半径算在爆炸范围内,即R1=R1+R2。人的运动范围也为一个圆R2=K。这样确定了两个圆。
分情况考虑,在不超界的情况下,如果相离或相切(圆心距离>=半径和)则可行。
如果相交,则优先考虑按圆心连线的方向逃离是否可行,是否超界。
若超界则求圆的交点,若交点有一个在边界内则可行。
内含不可行。
/**************************************************** Author : Coolxxx
Copyright 2017 by Coolxxx. All rights reserved.
BLOG : http://blog.csdn.net/u010568270 ****************************************************/
#include<bits/stdc++.h>
#pragma comment(linker,"/STACK:1024000000,1024000000")
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define mem(a,b) memset(a,b,sizeof(a))
const double EPS=0.00001;
const int J=;
const int MOD=;
const int MAX=0x7f7f7f7f;
const double PI=3.14159265358979323;
const int N=;
using namespace std;
typedef long long LL;
double anss;
LL aans;
int cas,cass;
int n,m,lll,ans; struct Point
{
double x, y;
Point(double x = , double y = ) :x(x), y(y) {}
}; typedef Point Vector; Vector operator - (Point A, Point B)
{
return Vector(A.x - B.x, A.y - B.y);
} Vector operator + (Vector A, Vector B)
{
return Vector(A.x + B.x, A.y + B.y);
} Vector operator * (Vector A, double p)
{
return Vector(A.x * p, A.y * p);
} Vector operator / (Vector A, double p)
{
return Vector(A.x / p, A.y / p);
} double Dot(Vector A,Vector B)
{
return A.x * B.x + A.y * B.y;
} double Length(Vector A)
{
return sqrt(Dot(A,A));
} double Angle(Vector A,Vector B) //求角度
{
return acos(Dot(A,B) / Length(A) / Length(B));
} double angle(Vector v)
{
return atan2(v.y,v.x);
} const double eps = 1e-;
int dcmp(double x)
{
if(fabs(x) < eps) return ;
else
return x < ? - : ;
} bool operator < (const Point& a,const Point& b)
{
return a.x < b.x || (a.x == b.x && a.y < b.y);
} bool operator == (const Point& a,const Point &b)
{
return dcmp(a.x - b.x) == && dcmp(a.y - b.y) == ;
} struct Circle
{
Point c;
double r;
Circle(Point c, double r) :c(c), r(r) {}
Point point(double a)
{
return Point(c.x + cos(a) * r, c.y + sin(a) * r);
}
}; int getCircleCircleIntersection(Circle C1,Circle C2,vector<Point>& sol) //求圆和圆的交点
{
double d = Length(C1.c - C2.c);
if(dcmp(d) == ) //首先圆心要重合
{
if(dcmp(C1.r - C2.r) == ) return -; //其次半径要相同,然后就可以推出两圆重合
return ;
}
if(dcmp(C1.r + C2.r - d) < ) return ; //相离没交点
if(dcmp(fabs(C1.r - C2.r) - d) > ) return ; //圆在圆中,没有交点 double a = angle(C2.c - C1.c); //向量C1C2的极角
double da = acos((C1.r * C1.r + d * d - C2.r * C2.r) / ( * C1.r * d)); //C1C2到C1P1的角
Point p1 = C1.point(a-da),p2 = C1.point(a+da); sol.push_back(p1);
if(p1 == p2) return ; //相切
sol.push_back(p2);
return ; //相交
}
inline bool inside(double x,double y)
{
return (x>= && x<= && y>= && y<=);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("test10.in","r",stdin);
// freopen("1.txt","w",stdout);
#endif
int i,j,k;
double x,y,z;
double xx,yy,zz;
// for(scanf("%d",&cass);cass;cass--)
// for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
// while(~scanf("%s",s))
while(cin>>x>>y>>z)
{
cin>>xx>>yy>>zz>>k;
Circle c1(Point(x,y),z+zz),c2(Point(xx,yy),k); if(dcmp(sqr(xx-x)+sqr(yy-y)-sqr(z+zz))>)
{
puts("Yes");
continue;
}
vector<Point>a;
vector<Point>::iterator iter;
while(!a.empty())a.pop_back();
z=getCircleCircleIntersection(c1,c2,a);
if(z == -)
{
puts("Yes");
}
else if(z == )
{
double d = Length(c1.c - c2.c);
if(dcmp(d) == ) //首先圆心要重合
{
if(dcmp(c1.r - c2.r) < )puts("Yes");
else puts("No");
}
else if(dcmp(c1.r + c2.r - d) < )puts("Yes");//相离没交点
else if(dcmp(c2.r - c1.r - d) > )puts("Yes");//圆在圆中,没有交点
else puts("No");
}
else if(z == )
{
iter = a.begin();
x = iter->x;
y = iter->y;
if(inside(x,y))puts("Yes");
else puts("No");
}
else
{
x=c1.c.x+(c2.c.x-c1.c.x)*c1.r/(Length(c1.c-c2.c));
y=c1.c.y+(c2.c.y-c1.c.y)*c1.r/(Length(c1.c-c2.c));
if(sqr(x-c2.c.x)+sqr(y-c2.c.y)<=k*k && inside(x,y))
{puts("Yes");continue;} iter = a.begin();
x = iter->x;
y = iter->y;
iter++;
xx = iter->x;
yy = iter->y;
if(inside(x,y) || inside(xx,yy))
puts("Yes");
else puts("No");
}
}
return ;
}
/*
// //
*/
XMU 1071 圣斗士黄金十二宫(七)银河星爆 【计算几何】的更多相关文章
- 周伯通的空明拳,米诺斯的星尘傀儡线,SAP Kyma的Serverless
Jerry一直认为,金庸的<天龙八部>里的武学建模已经有点脱离传统武侠小说的范畴了,像已经走上玄幻道路的灵鹫宫"八荒六合唯我独尊功",以及杀伤力足够能被视为现代激光武器 ...
- 【模拟】XMU 1055 数七
题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1055 题目大意: 报数游戏,不能报7的倍数和2进制下含有111的数. 给定n,m(1& ...
- hdu 6127 : Hard challenge (2017 多校第七场 1008)(计算几何)
题目链接 题意:二维平面上有n个点(没有重叠,都不在原点,任意两点连线不过原点),每个点有一个权值,用一条过原点的直线把他们划分成两部分,使两部分的权值和的乘积最大.输出最大的乘积. 极角排序后,将原 ...
- 【转】lonekight@xmu·ACM/ICPC 回忆录
转自:http://hi.baidu.com/ordeder/item/2a342a7fe7cb9e336dc37c89 2009年09月06日 星期日 21:55 初识ACM最早听说ACM/ICPC ...
- codevs1540 银河英雄传说
描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集 ...
- 家里蹲大学数学杂志 Charleton University Mathematics Journal 官方目录[共七卷493期,6055页]
家里蹲大学数学杂志[官方网站]从由赣南师范大学张祖锦老师于2010年创刊;每年一卷, 自己有空则出版, 没空则搁置, 所以一卷有多期.本杂志至2016年12月31日共7卷493期, 6055页.既然做 ...
- NOI2002 洛谷 P1196 银河英雄传说
神奇的并查集问题 题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩 ...
- NOI2002 银河英雄传说
P1196 银河英雄传说 367通过 1.1K提交 题目提供者该用户不存在 标签并查集NOI系列2001(或之前) 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 莱因哈特什么鬼? 私人代码 ...
- [转] POJ计算几何
转自:http://blog.csdn.net/tyger/article/details/4480029 计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很巧妙2.做计算几何题目,模板 ...
随机推荐
- pwntools各使用模块简介
pwntools pwntools 是一款专门用于CTF Exploit的python库,能够很方便的进行本地与远程利用的切换,并且里面包含多个模块,使利用变得简单.可以在github上直接搜索pwn ...
- POJ 3522 Slim Span (Kruskal枚举最小边)
题意: 求出最小生成树中最大边与最小边差距的最小值. 分析: 排序,枚举最小边, 用最小边构造最小生成树, 没法构造了就退出 #include <stdio.h> #include < ...
- mac下出现xcrun: error导致git无法使用的解决办法
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun BY ...
- 关于 HTTP meta 的 IE=edge 说明
http://www.oschina.net/question/54100_17414 陌生标记标记一: < meta http-equiv = "X-UA-Compatible&qu ...
- zoj 2727 List the Books
List the Books Time Limit: 2 Seconds Memory Limit: 65536 KB Jim is fond of reading books, and h ...
- 动手实操:如何用 Python 实现人脸识别,证明这个杨幂是那个杨幂?
当前,人脸识别应用于许多领域,如支付宝的用户认证,许多的能识别人心情的 AI,也就是人的面部表情,还有能分析人的年龄等等,而这里面有着许多的难度,在这里我想要分享的是一个利用七牛 SDK 简单的实现人 ...
- k/3cloud表格控件块粘贴代码逻辑
大家可以在表单插件EntityBlockPasting事件中自己处理,然后将cancel设置为true.以下代码可以参考一下,插件代码中需要将其中一些属性或方法修改,例如this.BusinessIn ...
- 静态工具类中使用注解注入service实例
一般需要在一个工具类中使用@Autowired 注解注入一个service.但是由于工具类方法一般都写成static,所以直接注入就存在问题. 使用如下方式可以解决: /** * */ package ...
- BZOJ1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害
n<=3000个点m<=20000条无向边的图,有p<=n个出发点,每个出发点都不可拆,现拆一些点使每个出发点都不能到达点1,求最小点数. 简单的最小割.每个点拆成两个x和y,无向边 ...
- App竞品技术分析 (3)减小安装包的体积(转)
http://blog.csdn.net/JspAndAsp/article/details/49339403 1 从几件小事说起 春节在家帮姐姐的iPhone手机安装市面上形形色色的App,忘记她是 ...