每次两车相遇时和追及到时(即两车在同一位置)都算作一次“重合”,可知两者的公式为:
相遇时间:time = (2*n - 1) * L / (Va + Vb) (n=1,2,3.......)
追及时间:time = (2*n - 1) * L / fabs(Va-Vb) (n=1,2,3.......)
(本题建议使用 scanf 和 printf,cin 和 cout 可能超时)
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAXN = 1005;
double t[MAXN * 2]; //“重合”的时间
int main()
{
int N;
scanf("%d", &N);
double L, Va, Vb; //距离,A车速度,B车速度
int num; //“重合”的序号数
double Time, Dist; //输出
while (N--)
{
scanf("%lf%lf%lf%d", &L, &Va, &Vb, &num);
int index = 0; //t数组中数据的个数
for (int i = 1; i < MAXN; i++)
{
t[index++] = (2.0 * i - 1.0) * L / (Va + Vb); //相遇时间
if (Va != Vb)
t[index++] = (2.0 * i - 1.0) * L / fabs(Va - Vb); //追及时间
}
sort(t, t + index - 1); //所有“重合”时间从小到大排序
Time = t[num - 1];
Dist = (Time * Va) - int(Time * Va / L) * L;
Dist = min(Dist, L - Dist);
printf("Time=%.3lf Dist=%.3lf\n", Time, Dist);
}
return 0;
}
继续加油。