物理课(physics)
物理课(physics)
题目描述
wzy正在上物理课!他发现了一个完全不会的题目:caoxia在一个奇妙的星球上(重力加速度为gg)踢了一只猫,猫飞起的路线与地面夹角为θθ (角度制),初速度为vv,猫非常地开心,所以每次落地后会自己反弹,但反弹后速度会乘以一个常数d(0≤d<1)d(0≤d<1)。请问猫最后的落点离起点多远?(猫飞行时方向不会改变,飞行过程中不计空气阻力与摩擦力,所有数值单位均为国际标准单位制)
输入
第一行一个数TT,代表有TT组数据。接下来TT每行44个浮点数,分别为θ,v,d,gθ,v,d,g,保留到小数点后两位.
数据范围及约定
subtask1:50pts,d=0d=0
subtask2:50pts,0≤v≤1000,0<g≤1000,0≤d<1,0<θ<90,T≤50,0000≤v≤1000,0<g≤1000,0≤d<1,0<θ<90,T≤50,000.
(良心出题人没有构造坑人数据,不会卡精度的,只要你相信我)
P.S.这道题可能违背一些物理常识,但是有(chu)一(ti)些(ren)原(tai)因(cai),就凑合着当水题做吧。
来源
solution
论学好文化课的重要性
首先把速度分解为向上大小为cos90-θ*v 的速度和向前为cosθ*v的速度
设为x,y
则一次的距离为t*v=2xy/g
记为S
题目求S+d^2S+d^4S
等比数列求和一下
ans=S/(1-d^2)
注意cos里面是弧度
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define db double
using namespace std;
int T;
db th,v,d,g;
int main()
{
freopen("physics.in","r",stdin);
freopen("physics.out","w",stdout);
cin>>T;
while(T--){
scanf("%lf%lf%lf%lf",&th,&v,&d,&g);
db x=cos(th/180*M_PI)*v,y=cos((90-th)/180*M_PI)*v;
db tmp=x*y*2/g;
tmp=tmp/(1-d*d);
printf("%.5lf\n",tmp);
}
return 0;
}