链接:传送门

题意:这个游戏是一个2D打飞机游戏,飞机以速度 v 水平飞行,它是一个简单的多边形,玩家从( 0 , 0 )向上射击,子弹有一个出速度 b ,子弹可以看作一个点,打中飞机边缘是无法击落飞机的,只有子弹进入飞机内部才能击落飞机,子弹受重力的影响,给出重力加速度 g ,XXX想知道子弹在第几秒击中飞机,如果始终无法击中则输出 Miss!

  • 注意:

    1. v 有正有负,v > 0 飞机是从左向右,v < 0 飞机从右向左
    2. g 的范围是 [ 0 , 10 ],如果 g = 0,说明轨迹是一个直线

思路:如果同时考虑子弹的轨迹和飞机的轨迹是非常复杂的,所以让飞机“静止”,这样子弹就有了一个水平方向的速度分量 -v ,子弹的轨迹就变成了一条抛物线,所以只需要枚举判断抛物线上的点是否在“飞机”内就可以了。

balabala:这道题加了点物理知识还是很有趣的,但也是简单题,我用的是扫描法......


/*************************************************************************
> File Name: hdu4458.cpp
> Author: WArobot
> Blog: http://www.cnblogs.com/WArobot/
> Created Time: 2017年05月02日 星期二 02时54分27秒
************************************************************************/ #include<bits/stdc++.h>
using namespace std; #define eps 1.0e-10
#define dou double struct point{
dou x;
dou y;
}po[111]; int n,m;
dou dabs(dou x){
return x<0?-x:x;
}
int dcmp(dou x){
if(fabs(x)<eps) return 0;
return x<0?-1:1;
} bool online(point p1,point p,point p2){
if( p.x<=max(p1.x,p2.x) && p.x>=min(p1.x,p2.x) && p.y<=max(p1.y,p2.y) && p.y>=min(p1.y,p2.y) ){
if ( dabs( (p.x-p1.x)*(p2.y-p1.y) - (p.y-p1.y)*(p2.x-p1.x) )<=eps )
return true;
}
return false;
}
bool inside(point p){
int cnt = 0 ;
dou xinter; // 血的教训
point p1,p2;
p1 = po[0];
for(int i=1;i<=n;i++){
p2 = po[i%n];
if( online(p1,p,p2) ) return false;
if( p.x<=max(p1.x,p2.x) && p.y<=max(p1.y,p2.y) && p.y>min(p1.y,p2.y) ){
if(p1.y!=p2.y){
xinter = (p.y-p1.y)*(p1.x-p2.x)/(p1.y-p2.y) + p1.x; // 理论上的最远距离
if(p1.x==p2.x || p.x<=xinter) cnt++;
}
}
p1 = p2;
}
if(cnt%2==0) return false;
else return true;
} int main(){
// v是飞机飞行速度,b为子弹初始速度,g为重力加速度
int v,b,g;
point p;
while(~scanf("%d%d%d",&v,&b,&g)){
if(v==0 && b==0 && g==0) break; scanf("%d",&n);
double Top = 0.0;
for(int i=n-1;i>=0;i--){
scanf("%lf%lf",&po[i].x,&po[i].y);
Top = max(Top,po[i].y);
}
dou t_max = dcmp(g)? 2*b/g : Top/b;
// 枚举时间
// x = (-v)*t
// y = b*t-1/2*g*t^2
bool ok = 0;
for(dou t = 0.0 ; t <= t_max ; t += 0.001 ){
p.x = (-v)*t;
p.y = b*t - 0.5*g*t*t;
if( inside(p) ){
printf("%.2lf\n",t);
ok = 1;
break;
}
}
if(!ok) printf("Miss!\n");
}
return 0;
}

HDU 4458 Shoot the Airplane( 判断点在多边形内外 )的更多相关文章

  1. HDU 1756 Cupid's Arrow 判断点在多边形的内部

    Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  2. ZOJ 1081 Points Within( 判断点在多边形内外 )

    链接:传送门 题意:给出n个点围成的一个多边形,现在有m个点p,询问p是否在多边形内,你可以认为这些点均不同且输入的顶点是多边形中相邻的两个顶点,最后的顶点与第一个相邻并且每一个顶点都连接两条边( 左 ...

  3. hdu 1756:Cupid's Arrow(计算几何,判断点在多边形内)

    Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  4. HDU 1756 Cupid's Arrow( 判断点在多边形的内外 )

    链接:传送门 思路:判断每支箭是否在多边形内,计算几何点定位中水题,不清楚下面的代码能不能适用于给定点的顺序不确定( 既不是顺时针又不是逆时针 ) /************************* ...

  5. matlab练习程序(射线法判断点与多边形关系)

    依然是计算几何. 射线法判断点与多边形关系原理如下: 从待判断点引出一条射线,射线与多边形相交,如果交点为偶数,则点不在多边形内,如果交点为奇数,则点在多边形内. 原理虽是这样,有些细节还是要注意一下 ...

  6. zoj 1081 判断点在多边形内

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=81Points Within Time Limit: 2 Second ...

  7. Broken line - SGU 124(判断点与多边形的关系)

    题目大意:RT 分析:构造一条射线,如果穿越偶数条边,那么就在多边形外面,如果穿越奇数条边,那么就在多边形里面. 代码如下: ===================================== ...

  8. 判断点在多边形内算法的C++实现

    目录 1. 算法思路 2. 具体实现 3. 改进空间 1. 算法思路 判断平面内点是否在多边形内有多种算法,其中射线法是其中比较好理解的一种,而且能够支持凹多边形的情况.该算法的思路很简单,就是从目标 ...

  9. C# GDI+ 利用 Rectangle GraphicsPath 判断 矩形或多边形 图形关系

    最近在做一些简单的图像对比工作,总结了一些GDI+对象的使用方式,记录下来共享给大家使用. 判断Rectangl与多边形的关系 /// <summary> /// 是否包含输入范围 /// ...

随机推荐

  1. IDEA - 自动添加代码

    自动添加代码Surroundwith 快捷键:Ctrl+Alt+T 有if.while.function.try.....

  2. Code VS 1002 搭桥

    题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物.现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着矩形的方格的边沿搭建 ...

  3. BZOJ 3028 食物 (生成函数+数学题)

    题面:BZOJ传送门 题目让我们求这些物品在合法范围内任意组合,一共组合出$n$个物品的方案数 考虑把每种食物都用生成函数表示出来,然后用多项式乘法把它们乘起来,第$n$项的系数就是方案数 汉堡:$1 ...

  4. 3.2、使用Flask-Bootstrap集成Twitter Bootstrap

    Bootstrap(http://getbootstrap.com/)是 Twitter 开发的一个开源框架,它提供的用户界面组件可用于创建整洁且具有吸引力的网页,而且这些网页还能兼容所有现代 Web ...

  5. NOIP2018提高组金牌训练营——动态规划专题

    NOIP2018提高组金牌训练营——动态规划专题 https://www.51nod.com/Live/LiveDescription.html#!#liveId=19 多重背包 二进制优化转化成01 ...

  6. MVC笔记(一)

    1 MVC介绍 MVC是一个编程思想. 是一种设计模式 思想: 将一个功能分解成3个部分, M: Model (模型) 处理数据相关的逻辑 V: View (视图) 显示页面 C: Controlle ...

  7. 【CodeForces 353 A】Domino

    [链接] 我是链接,点我呀:) [题意] [题解] 分类讨论一波 设第一个数组的奇数个数为cnt1 第二个数组的奇数个数为cnt2 显然只有在(cnt1+cnt2)%2==0的情况下. 才可能第一个数 ...

  8. 【ACM-ICPC 2018 南京赛区网络预赛 A】An Olympian Math Problem

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 估计试几个就会发现答案总是n-1吧. 队友给的证明 [代码] #include <bits/stdc++.h> #def ...

  9. Strtus配置Tomcat出现问题2

    启动myeclipse的tomcat6.0有如下提示:The APR based Apache Tomcat Native library which allows optimal performan ...

  10. web.xml 中context-param元素

    context-param元素含有一对参数名和参数值,用作应用的ServletContext上下文初始化参数.参数名在整个Web应用中必须是惟一的 param-name 子元素包含有参数名,而para ...