timus 1192. Ball in a Dream URAL 解题报告 平生第一个计算几何+高中物理
看来高中物理没白学,这个题用我仅剩下的高中物理学知识分析下竟然找到了方法,再加上计算几何,其实也说不上计算结合题,无非就是利用了三角函数来做,终于AC掉了,虽然是个非常水的题目!但是仍然很高兴,以前碰到这种控制精度的题就头大啊! 好像不好做啊,好做不好AC啊,今天终于AC了……
题目大意:
一个人做梦,梦到在一个飞机上,其实应该是一个非常大的没有尽头的平面,endless, 然后斜抛一个球,因为前面说是没有尽头的平面嘛,所以不可能是斜下抛……
既然是斜往上抛的话就有水平和向上的两个分量,这两个速度分量vx,vy; 关于vy,视为一个上抛运动,到最高点再下来时,竖直方向的能量没变,其实水平方向的也没变,在一次抛出到落地的时间为 t=2*vy/g; 因为竖直到最高点的时候速度为0,下降的时候是一个逆过程…… 这一段s=vx*t=v*cosa*2*v*sina/g; 然后动能变为1/k 即v^2/=k……
然后看代码,为了保持精度直到v^2<EPS 就不要再算下去了
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<cstdio>
#include<math.h>
#define EPS 1e-7
using namespace std;
const double pi=3.1415926535;
double v0,a,k;
double f(double v)
{///求一次运动之间的水平距离,下面的v实际是v^2
return v*sin(a*pi/90.0)/10.0;
}
int main()
{
cin>>v0>>a>>k;
double ans=0,tmp=0;
v0=v0*v0;
while(1)
{
tmp=f(v0);
// if(tmp<0.000000001) break;
ans+=tmp;
v0=v0/k;
if(v0<=EPS)break;///注意这里,不能是0,因为不可能是0
}
printf("%.2f\n",ans+EPS);
}
下面是pascal代码,超短,是discuss里面的
var v,a,k:real;
begin
readln(v,a,k);
write(((v*v*k*sin(a*3.1415926535/90))/(10*(k-1))):0:2);
end.
timus 1192. Ball in a Dream URAL 解题报告 平生第一个计算几何+高中物理