题目链接
题意:题意很简单就是模拟一个过程,但是模拟很复杂错了很多次。
下面是AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
double d,v0,v1,v2,t;
cin>>d>>v0>>v1>>v2>>t;//没问题,输入
double start0=0,start1=1,start2=0;//初值,没问题
double flagt=0;//当前状态下用的时间
double sumt=0;//当前状态下用的总时间
//t0表示v0到达终点的时间,t1表示v1到达终点的时间
double t0=(double)d*1.0/v0*1.0;
double t1=(double)(d-1)*1.0/v1*1.0;
if(v1*t+1<d)//最快的人没有到达t1
{
double ans;
while(1)
{
flagt=(double)(start1-start0)*1.0/(v2-v1)*1.0;//每次向前走相遇用的时间
sumt+=flagt;
if(sumt>=t)//说明时间到了,且是在前进时结束
{
sumt-=flagt;
t-=sumt;
ans=start0+t*v2;
break;
}
start1+=(double)v1*1.0*flagt*1.0;
start0+=(double)v0*1.0*flagt*1.0;
flagt=(double)(start1-start0)*1.0/(v2+v0)*1.0;
sumt+=flagt;
if(sumt>=t)//说明时间到了,且是在后退时结束
{
sumt-=flagt;
t-=sumt;
ans=start1-t*v2;
break;
}
start1+=(double)flagt*v1;
start0+=(double)flagt*v0;
}
printf("%.7lf",ans);
}
//以上情况没有问题
else if(v1*t+1>=d&&v0*t<d)//快的到了,慢的没有到
{
double kk;
double ans;
int flag=0;
while(1)
{
flagt=(double)(start1-start0)*1.0/(v2-v1)*1.0;//下一次相遇用的时间
sumt+=flagt;
if(sumt>=t1&&flag==0)//说明下一次相遇之前v1到了
{
sumt-=flagt;
flagt=(d-start0)*1.0/v2*1.0;//所需要的总时间
v1=0;
flag=1;
start1=d;
sumt+=flagt;
}
if(sumt>=t)//说明时间到了,且是在前进时结束
{
sumt-=flagt;
t-=sumt;
ans=start0+t*v2;
break;
}
start1+=(double)v1*1.0*flagt*1.0;
kk=start1;
start0+=(double)v0*1.0*flagt*1.0;
flagt=(double)(start1-start0)*1.0/(v2+v0)*1.0;
sumt+=flagt;
if(sumt>=t1&&flag==0)//表示往后退的时候,v1到达d
{
start1=d;//更新 start1,start0
v1=0;
flag=1;
}
if(sumt>=t)//说明时间到了,且是在后退时结束
{
start1=kk;
sumt-=flagt;
t-=sumt;
ans=start1-t*v2;
break;
}
start1+=(double)flagt*v1;
start0+=(double)flagt*v0;
}
printf("%.7lf\n",ans);
}
else printf("%.7lf",d);//快的到了,慢的也到了,最终一定会在终点相遇
return 0;
}
注意:每个变量都要设成double形式,除了个别的,这一点很容易错