hdoj 两车追及或相遇问题 1275 (数学)

两车追及或相遇问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1081    Accepted Submission(s): 330


Problem Description
外号叫“猪头三”的小学生在数学课上,经常遇到两车相遇或追及的方程题,经过长时间的练习,他发现了许多规律,然而他不懂计算机,他想请你帮忙编写一个计算机程序,解决他的问题。
题目的描述是这样的:甲、乙两地相距L公里,A车的速度为VA公里/小时,B车的速度为VB公里/小时,A车和B车开始时分别在甲、乙两地,现在两车同时从甲、乙两地出发,并且开始计时,两车到达甲、乙两地后返回继续行驶,这样会有许多次追及或相遇的时候,我们假定称追及或相遇的时候为“重合”,请输出“重合”时的时间以及离甲、乙两地较近地的距离。

Input
本题有多个测试数据组,第一行为测试数据组数N,接着是N行数据,每行的数据按顺序分别为实数类型的距离、A车的速度、B车的速度以及整数类型的第几次“重合”的序号数(<=1000)。

Output
Time=xxxx.xxx Dist=xx.xxx输出的精度为精确到小数点后三位。

Sample Input
  
  
2 120.7 90.0 90.0 10 100.5 80.7 69.3 1

Sample Output
  
  
Time=12.741 Dist=60.350 Time=0.670 Dist=46.431

对头相遇时:time*(v1+v2)=d*(2*i-1)

追击相遇时:time*(fabs(v1-v2))= d*(2*i-1)

AC代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define E 1e-10
using namespace std;
double ti[2010];
int main()
{
	int t,i,c;
	double l,a,b,dis;
	double aa,bb,v;
	int xy,zj;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%lf%lf%lf%d",&l,&a,&b,&c);
		bb=9999999;//这块必须初始化,因为第一次肯定是相遇问题;
		xy=zj=1;
		v=fabs(a-b);
		for(i=1;i<=c;i++)
		{
			aa=((2*xy-1)*l)/(a+b);
			if(v>E)
				bb=((2*zj-1)*l)/v;
			if(aa<bb)
			{
				ti[i]=aa;
				xy++;
			} 
			else
			{
				ti[i]=bb;
				zj++;
			}
		}
		dis=ti[c]*a;
		while(dis>=l)
			dis-=l;
		dis=min(dis,l-dis);
		printf("Time=%.3lf Dist=%.3lf\n",ti[c],dis);
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值