题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1275
这题是一个数学题目,知道两个公式那就好办了;
对头相遇时:time*(v1+v2)=d*(2*i-1)
追击相遇时:time*(fabs(v1-v2))= d*(2*i-1)
这两个公式是这题的难点!其他一切好说。
#include<stdio.h>
#include<math.h>
#define esp 1e-10
double time[2000];
int main(void)
{
int t,n,i,j,k;
double d,v1,v2,f,dist,p,q;
scanf("%d",&t);
while(t--)
{
scanf("%lf%lf%lf%d",&d,&v1,&v2,&n);
q=999999999;//为了以防f==0即v1==v2时那种情况;
j=k=1;
f=fabs(v1-v2);
for(i=1;i<=n;i++)
{
p=((2*j-1)*d)/(v1+v2);
if(f>esp)
{
q=((2*k-1)*d)/f;
}
if(p<q)
{
time[i]=p;
j++;
}
else
{
time[i]=q;
k++;
}
}
dist=time[n]*v1;
while(dist>=d)
{
dist=dist-d;
}
printf("Time=%.3lf Dist=%.3lf\n",time[n],dist<d-dist?dist:d-dist);
}
return 0;
}