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;
}

继续加油。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值