1. 程式人生 > >物理課(physics)

物理課(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),就湊合著當水題做吧。

 

來源

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