题意:华仔读题好厉害,膜拜之,吾等六级跪了的读题总是读不清。
一个火车在一个水平面上圆周运动,相当于给你一个圆柱体形的弹簧,沿着线一直走吧,然后圆心处有一个camera,每个时刻需要消耗的能量是X*D*ds,问在能量E的限制下,能走多远。已知的量还包括圆周上的半径和角速度,以及垂直方向上的速度。根据题目意思理解,是个积分问题。对每时每刻消耗的能量积分,那么这里的ds就相当于是瞬间的速度了,这个表示为sqrt((rw)^2+v^2) 是个大小不变的量,对于D,就是积分from 0 to T sqrt(r^2+(T-t)^2*v^2) 这里的T就是能量消耗完停止的时间,这个可以用二分求。
具体积分实现见代码吧。
注意r=0特判。
#include <cstring>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
using namespace std;
#define eps (1e-9)
double r,v,w,X,E;
bool zero(double t)
{
return fabs(t)<eps;
}
double jifen(double t)
{
return (t*v*sqrt(r*r+t*t*v*v)+r*r*log(v*(t*v+sqrt(r*r+t*t*v*v))))/(2*v);
}
bool ok(double mid)
{
double tmp=X*sqrt(r*r*w*w+v*v)*(jifen(mid)-jifen(0));
if(tmp+eps>E)
return true;
return false;
}
int main()
{
while(scanf("%lf%lf%lf%lf%lf",&r,&w,&v,&X,&E)!=EOF)
{
if(zero(r)&&zero(w)&&zero(v)&&zero(X)&&zero(E))
break;
double left=0,right=30*24*3600.0,ans=-1,mid;
int cas=100;
if(zero(r))
{
printf("%.4lf\n",sqrt(2*E/v/v));
continue;
}
while(cas--)
{
mid=(left+right)/2;
if(ok(mid))
{
ans=mid;
right=mid;
}
else
{
left=mid;
}
}
printf("%.4lf\n",ans);
}
return 0;
}