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; }
本博客专注于错误锦集,在作死的边缘试探