hdu(3940)The Angry Birds

题意:

这题是一道简单的物理题,实际上只要一个抛物线的公式就可以了,一共有3种鸟,各有不同的特性:

红鸟的轨迹是一条抛物线;

黄鸟的前期轨迹是一条抛物线,在t时,黄鸟的Vx,Vy翻倍;

蓝鸟的前期轨迹是一条抛物线,在t时,可以分裂成3只小蓝鸟,每只的轨迹都是抛物线。

分析:

说来说去,其实都是求抛物线的,因此只要有一个函数用来计算,那么做起来会方便的多。

 

 

#include"stdio.h"
#include"string.h"
#include"math.h"
double fun(double vx,double vy,double h)//计算水平距离
{
 return vx*(vy+sqrt(vy*vy+2*9.8*h))/9.8;
}
double fun1(double vy,double h,double t)//计算竖直高度。
{
 return h+vy*t-4.9*t*t;
}
int main()
{
 double m,n,vx,vy,t,v1,h,v2,v3,l;
 char a[100];
 while(scanf("%lf%s",&h,a)!=EOF)
 {
  if(strcmp(a,"Red")==0)
  {
   scanf("%lf%lf",&vx,&vy);
   printf("%.3lf\n",fun(vx,vy,h));
  }
  else if(strcmp(a,"Blue")==0)
  {
   scanf("%lf%lf%lf%lf%lf%lf",&vx,&vy,&t,&v1,&v2,&v3);
             m=fun(vx,vy,h);
    n=fun1(vy,h,t);
    if(m<t*vx)//如果t时刻已经落地。
    {
     printf("%.3lf\n",m);
     continue;
    }
   // 否则的话重新计算此时的高度,竖直速度和水平距离。。
    h=fun1(vy,h,t);
    vy=vy-9.8*t;
    l=vx*t;
    printf("%.3lf %.3lf %.3lf\n",l+fun(v1,vy,h),l+fun(v2,vy,h),l+fun(v3,vy,h));
  }
  else
  {
   scanf("%lf%lf%lf",&vx,&vy,&t);
   if(fun(vx,vy,h)<t*vx)//如果t时刻已经落地。
   {
   printf("%.3lf\n",fun(vx,vy,h));
   continue;
   }
   //否则的话重新计算此时的高度,竖直速度和水平距离。。
   h=fun1(vy,h,t);
   l=vx*t;
   vy=vy-9.8*t;
   printf("%.3lf\n",l+fun(2*vx,2*vy,h));
  }
 }
 return 0;
}

   
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值