zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

    本博客专注于错误锦集,在作死的边缘试探
  • 相关阅读:
    各个数字类型取值范围以及推理
    进制转换原理
    位运算操作符_
    读取文件内容
    java中thread的start()和run()的区别
    二进制的负数转换
    位运算符号
    Hadoop的辉煌还能延续多久?
    Hadoop 新 MapReduce 框架 Yarn 详解
    MapReduce工作原理讲解
  • 原文地址:https://www.cnblogs.com/SweetBeens/p/6430881.html
Copyright © 2011-2022 走看看