题目链接
题意:题意很简单就是模拟一个过程,但是模拟很复杂错了很多次。
下面是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,start0v1=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形式,除了个别的,这一点很容易错