A1065. 龟兔赛跑
题目http://www.tsinsen.com/A1065
有两个注意的地方:
1.由于浮点数的精度问题,比方说2是1.9999999999,1是0.99999999999,所以在速度倍数降低为0.1就不在下降了这一判断条件上,必须是part>0.2.如果这个不对,那么4,5,8,9,10会不ac
2.这是我的失误,没有想到有可能路程比较长,一段路程(比方水里)就跑了多个T。如果这个不对,4,5会不ac。
这道题核心是数学题,询问的也是奔跑的时间,兔子乌龟没有交互,如果对兔子乌龟有交互的感兴趣可以看:http://www.tsinsen.com/A1062,我虽然做了但是并没有拿出来写随笔。有需求的问我我在写吧。
#include <iostream>
#include <stdio.h>
using namespace std;
int n;
double T;
double a[5];
double b[5];
int main()
{
cin>>n>>T;
for(int i=1; i<=4; i++)
cin>>a[i];
for(int i=1; i<=4; i++)
cin>>b[i];
//阶段,同一阶段同意速度
double part=1,part2=1;
double t1=0,t2=0;
double leave1=0,leave2=0;
for(int u=1; u<=n; u++)
{
int way;
double dist1,dist2,dt1,dt2;
cin>>way>>dist1;
dist2=dist1;
// dt1=dist1/(a[way]*part);
// dt2=dist2/(b[way]*part2);
while(1){
dt1=dist1/(a[way]*part);
if((dt1+leave1)>=T)//能否在剩余的同一阶段时间内跑完
{
dist1=dist1-(T-leave1)*(a[way]*part);//下一阶段剩余的路程
if(part>0.2)
part=part-0.1;
t1=t1+(T-leave1);//增加时间
leave1=0;
}
else
{
t1=t1+dt1;
leave1=leave1+dt1;
break;
}
}
while(1){
dt2=dist2/(b[way]*part2);
if((dt2+leave2)>=T)//能否在剩余的同一阶段时间内跑完
{
dist2=dist2-(T-leave2)*(b[way]*part2);//下一阶段剩余的路程
if(part2>0.2)
part2=part2-0.1;
t2=t2+(T-leave2);//增加时间
leave2=0;
}
else
{
t2=t2+dt2;
leave2=leave2+dt2;
break;
}
}
}
// cout<<t1<<" "<<t2<<endl;
int u1=(t1+0.005)*100;
int u2=(t2+0.005)*100;
t1=u1*0.01;
t2=u2*0.01;
if(t1>t2)
{
cout<<"R"<<endl;
cout.precision(2);
cout<<fixed<<t2;
}
else if(t1<t2)
{
cout<<"T"<<endl;
cout.precision(2);
cout<<fixed<<t1;
}
else
{
cout<<"D"<<endl;
cout.precision(2);
cout<<fixed<<t1;
}
return 0;
}
本博客专注于错误锦集,在作死的边缘试探

浙公网安备 33010602011771号