HDU 1275(两车追及或相遇问题)

每次两车相遇时和追及到时(即两车在同一位置)都算作一次“重合”,可知两者的公式为:

相遇时间: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;
}

继续加油。

发布了206 篇原创文章 · 获赞 1 · 访问量 8988

猜你喜欢

转载自blog.csdn.net/Intelligence1028/article/details/104829055
hdu