/...................................................................................................................................................................................................................................................................................................................\
貌似这个题在杭电上交的人数不太多哦,开始没想明白,想明白了原来是一个圆周追击与相遇问题,可以将题目中到达对面立即掉头理解为一个圆周运动,因为可以认为题目中连接2个城市的公路为双向车道,当考虑追击与相遇可以分开考虑,追击时候理解的路线图为
→→→→→→→→→→→→→→
↑ ↑→→→→→→→→→→→→↓ ↓
↑ ↑ ↓ ↓
↑ ↑←←←←←←←←←←←←↓ ↓
←←←←←←←←←←←←←←
开始的时候可以A在左边,B在右边,则为一个距离为半个圆周的追击问题,圆周长为2倍的甲乙间距离当第一次追击 成功后便改变为距离为一个圆周的追击问题, 这个时候可以发现从第二次开始以后每次追击距离都是一个圆周,则追击周期为第一追击耗时的两倍, 从第一次求第二次乃至以后的N次都是增加这个周期就能得到
当寻找相遇时可以让车辆改变行驶的车道,因为刚才图中依然能够理解到相遇,即对面行驶不同车道相遇,改变车道对追击与相遇不产生影响,但便于理解
→→→→→→→→→→→→→→
↑ ↓←←←←←←←←←←←←↑ ↓
↑ ↓ ↑ ↓
↑ ↓→→→→→→→→→→→→↑ ↓
←←←←←←←←←←←←←←
该图表示时可以理解为一个距离为半个圆周的相遇问题,当第一次相遇后可以改变为距离为一个圆周的相遇问题,此时跟上述原理一样,从第一次求第二次开始每次增加第一次耗时的两倍,按照周期则可求得N次相遇的时间
追击与相遇的分别的第N次时间已经可求,那给定总的第N次时间和最短距离便能搞定了
\.................................................................................................................................................................................................................................................................................................................../
#include<stdio.h>
int main()
{
int a,n,i;
double v1,v2,time1,time2,t1,t2,l1,l2,min,s;
scanf("%d",&n);
while(n--)
{
scanf("%lf%lf%lf%d",&s,&v1,&v2,&a);
time1=s/(v1+v2);
if(v1>v2)
time2=s/(v1-v2);
else if(v1<v2)
time2=s/(v2-v1);
else
time2=0;
t1=-time1;
t2=-time2;
for(i=1;i<=a;i++)
{
if(t1+2*time1<t2+2*time2||t2==0)
{
t1+=2*time1;
min=t1;
}
else if(t2+2*time2<t1+2*time1)
{
t2+=2*time2;
min=t2;
}
}
l1=v1*min;
while(l1>=s*2)l1-=2*s;
if(l1>=s)l1=2*s-l1;
l2=s-l1;
if(l2<l1)
l1=l2;
printf("Time=%.3lf Dist=%.3lf\n",min,l1);
}
return 0;
}