http://acm.hdu.edu.cn/showproblem.php?pid=1275
分析:
两车第i次重合:
相遇:t * (va + vb) = s * (2* i-1) ;
追及:t * |va - vb | = s* (2*i -1);
途中可能相遇也可能追及(第一次一定为相遇),取时间较少的记录更新;
代码:
//hdu1275 两车追及或相遇问题
#include <stdio.h>
#define eps 1e-8
double s,va,vb;
double time1,time2,time[1010];
int num;
int main()
{
int t;
int j,k;
double vd,stmp;
scanf("%d",&t);
while(t--){
scanf("%lf%lf%lf%d",&s,&va,&vb,&num);
j=k=1;
time2=999999;
vd= (va-vb) < 0 ? (vb-va) : (va-vb);
for(int i=1;i<=num;i++){
time1=s*(2*j-1) / (va+vb);
if(vd>eps) time2=s*(2*k-1) / vd;
if(time1<time2){
time[i]=time1;
j++;
}
else{
time[i]=time2;
k++;
}
}
stmp= time[num]*va;
while(stmp>=s) stmp -= s;
stmp= (s-stmp) > stmp ? stmp : (s-stmp);
printf("Time=%.3f Dist=%.3f\n",time[num],stmp);
}
return 0;
}