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
316

Sample Output

Yes

HINT

 

Source

[Submit][Status][Web Board]

题目链接:

  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 圣斗士黄金十二宫(七)银河星爆 【计算几何】的更多相关文章

  1. 周伯通的空明拳,米诺斯的星尘傀儡线,SAP Kyma的Serverless

    Jerry一直认为,金庸的<天龙八部>里的武学建模已经有点脱离传统武侠小说的范畴了,像已经走上玄幻道路的灵鹫宫"八荒六合唯我独尊功",以及杀伤力足够能被视为现代激光武器 ...

  2. 【模拟】XMU 1055 数七

    题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1055 题目大意: 报数游戏,不能报7的倍数和2进制下含有111的数. 给定n,m(1& ...

  3. hdu 6127 : Hard challenge (2017 多校第七场 1008)(计算几何)

    题目链接 题意:二维平面上有n个点(没有重叠,都不在原点,任意两点连线不过原点),每个点有一个权值,用一条过原点的直线把他们划分成两部分,使两部分的权值和的乘积最大.输出最大的乘积. 极角排序后,将原 ...

  4. 【转】lonekight@xmu·ACM/ICPC 回忆录

    转自:http://hi.baidu.com/ordeder/item/2a342a7fe7cb9e336dc37c89 2009年09月06日 星期日 21:55 初识ACM最早听说ACM/ICPC ...

  5. codevs1540 银河英雄传说

    描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集 ...

  6. 家里蹲大学数学杂志 Charleton University Mathematics Journal 官方目录[共七卷493期,6055页]

    家里蹲大学数学杂志[官方网站]从由赣南师范大学张祖锦老师于2010年创刊;每年一卷, 自己有空则出版, 没空则搁置, 所以一卷有多期.本杂志至2016年12月31日共7卷493期, 6055页.既然做 ...

  7. NOI2002 洛谷 P1196 银河英雄传说

    神奇的并查集问题 题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩 ...

  8. NOI2002 银河英雄传说

    P1196 银河英雄传说 367通过 1.1K提交 题目提供者该用户不存在 标签并查集NOI系列2001(或之前) 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 莱因哈特什么鬼? 私人代码 ...

  9. [转] POJ计算几何

    转自:http://blog.csdn.net/tyger/article/details/4480029 计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很巧妙2.做计算几何题目,模板 ...

随机推荐

  1. CentOS 7下安装Composer + Laravel

    1.wget https://dl.laravel-china.org/composer.phar -O /usr/local/bin/composer chmod a+x /usr/local/bi ...

  2. Cannot delete or update a parent row: a foreign key constraint fails....

    在操作”小弟“这张表时候报错 想在“小弟”上面加入数据或者更新数据,就要听老大的, 这句话后面跟着的表就是“老大”,必须老大有数据索引,“小弟“才可以加入或者更新 查看“小弟”表的外键,会发现有对“老 ...

  3. window查看哪些端口被占用命令

    管理员方式运行cmd netstat -n

  4. 简单的发红包的PHP算法

    假设有有10元钱 ,发给10个人.保证每个人都有钱拿,最少分得0.01.我们最先想到的肯定就是随机.0.01-10随机.但是会出现第一个人就分得9.99的情况.下面就没人可分了.然后就是我的错误思路 ...

  5. HDU2069-Coin Change

    Coin Change 这题题意和UVA674很像,但加了一个限制条件不能超过100个硬币.于是我们可以用d[i][j]来表示硬币数量为i时金钱总数为j时的方法总数,总钱不能超过250. const ...

  6. oracle如何向空表中添加一个类型为clob的非空列

    一般的添加非空列的步骤是:先add可以为空的列,然后update该列为一个值(比如0),最后modify该列的类型 但是遇到类型为clob的就不行了.在modify这步时报错:ORA-22296:in ...

  7. 【转】关于大型网站技术演进的思考(十三)--网站静态化处理—CSI(5)

    讲完了SSI,ESI,下面就要讲讲CSI了 ,CSI是浏览器端的动静整合方案,当我文章发表后有朋友就问我,CSI技术是不是就是通过ajax来加载数据啊,我当时的回答只是说你的理解有点片面,那么到底什么 ...

  8. [luoguP1186] 玛丽卡(spfa)

    传送门 因为要随机删除一条边,而枚举所有边肯定会超时,经过发现,先求出一遍最短路,而要删除的边肯定在最短路径上,删除其他的边对最短路没有影响. 所以可以先求出最短路,再枚举删除最短路上的每一条边再求最 ...

  9. 洛谷P1432 倒水问题

    题目背景 In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were confronted with th ...

  10. free delete malloc new(——高品质量程序设计指南第16章)

    free和delete只是把指针所指向的内存给释放掉了,但是指针本身并没有被删掉. 所以在释放掉内存后一定要记得将指针指向NULL ,动态内存分配不会自动的释放,一定要记得free掉