物理课(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.

 

良心出题人没有构造坑人数据,不会卡精度的,只要你相信我

扫描二维码关注公众号,回复: 4103187 查看本文章

P.S.这道题可能违背一些物理常识,但是有(chu)一(ti)些(ren)原(tai)因(cai),就凑合着当水题做吧。

 

来源

noip2018模拟-南外


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;
}

猜你喜欢

转载自blog.csdn.net/liankewei123456/article/details/83719699