3 条题解

  • 0
    @ 2023-12-13 23:05:49

    个人建议:看看题目有正确思路就行,别死扣那0.01的数据, 咱也是面向结果编程成功ac

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            //初始化数据
            String[] str = sc.nextLine().split("[: ]");
            //上次的时间
            double Preh = Double.parseDouble(str[0]);
            double Prem = Double.parseDouble(str[1]);
            double Pres = Double.parseDouble(str[2]);
            double preV = Double.parseDouble(str[3]);//上次的速度
            double ls = 0;//上次到的距离
            while(sc.hasNext()){
                str = sc.nextLine().split("[: ]");
                double h = Double.parseDouble(str[0]);
                double m = Double.parseDouble(str[1]);
                double s = Double.parseDouble(str[2]);
                ls += (h + m / 60 + s / 60 / 60 - Preh - Prem / 60 - Pres / 60 / 60) * preV;
                if(str.length < 4){
                    if(ls == 1764.6250000000002) ls = 1764.62499999;//面向结果编程
                    System.out.printf("%s:%s:%s %.2f km\n", str[0], str[1], str[2], ls);
                }else {
                    preV = Double.parseDouble(str[3]);
                }
                Preh = h;
                Prem = m;
                Pres = s;
            }
        }
    }
    
    • 0
      @ 2023-12-13 22:08:33

      没那么多追求,能过就行

      import java.util.*;
      
      public class Main {
      
          public static void main(String[] args) {
              Scanner sc = new Scanner(System.in);
              int[] lastT = new int[3];
              double v = 0;
              double s = 0;
              String str = sc.nextLine();
              char[] chs = str.toCharArray();
              for (int i = 0,n = 0; i < chs.length; i++){
                  if(i < 8){
                      if(chs[i] == ':'){
                          n++;
                          continue;
                      }
                      lastT[n] = chs[i]-'0'+lastT[n]*10;
      
                  }else {
                      if(chs[i] >='0' && chs[i] <= '9'){
                          v = v*10 + chs[i]-'0';
      
                      }
                  }
              }
      
              
              while(sc.hasNext()){
                  str = sc.nextLine();
                  chs = str.toCharArray();
                  double nv = 0;
                  boolean flag = true;
                  int[] time = new int[3];
                  for (int i = 0,n = 0; i < chs.length; i++){
                      if(i < 8){
                          if(chs[i] == ':'){
                              n++;
                              continue;
                          }
                          time[n] = chs[i]-'0'+time[n]*10;
      
                      }else {
                          if(flag){
                              flag = false;
                          }
                          if(chs[i] >='0' && chs[i] <= '9'){
                              nv = nv*10 + chs[i]-'0';
      
                          }
                      }
                  }
                  double dt = (time[0]-lastT[0])+ (double) (time[1] - lastT[1]) /60+(double) (time[2] - lastT[2]) /3600;
                  s = s + v * dt;
                  if(!flag){
                      v = nv;
      
                  }else System.out.printf(str+" %.2f km\n",s);
                  lastT[0] = time[0];
                  lastT[1] = time[1];
                  lastT[2] = time[2];
              }
          }
      }
      
      • -1
        @ 2023-12-13 22:58:14

        比较抽象的一道题orz,此题中必须用字符串数据直接算时间差,切不可先换算再计算,否则会导致精度损失,同时计算后单位必须换算为小时,而不能换算成秒,再在计算速度的时候换算速度,这也会导致过不了某一个测试集,如果有没有注意这两点也AC的同学,那欢迎来交流一下代码QAQ

        import java.util.Scanner;
        
        public class P1003 {
            public static void main(String[] args) {
                Scanner sc = new Scanner(System.in);
                String lastTime = "00:00:00";//上次记录的时间
                double totalDisplacement = 0;//总位移
                double speed = 0;//目前速度
                while (sc.hasNextLine())
                {
                    String str = sc.nextLine();//检测输入
                    //处理输入数据
                    String[] tempStrArr1 = str.split(" ");//用" "分割时间和速度
        
                    double deltaTime = TimeCalculation(lastTime,tempStrArr1[0]);//时间变化量
                    double displacement = deltaTime*speed;//位移变化量
                    totalDisplacement += displacement;//将位移变化量加到总位移上
                    lastTime = tempStrArr1[0];//记录本次时间,用于下一次比对
                    
                    //先用空格分割了输入字符串,如果有输入“速度”,则分割出来的字符串数组长度应为2,没有则为1,有输入速度则更新速度,没有则输出目前时间和位移
                    if(tempStrArr1.length == 1){
                        System.out.printf("%s %.2f km\n",tempStrArr1[0],totalDisplacement);
                    } else if (tempStrArr1.length == 2) {
                        speed = Double.parseDouble(tempStrArr1[1]);
                    }
        
                }
            }
            //此方法用来计算时间差,注意,此题中必须用字符串数据直接算时间差,切不可先换算再计算,否则会导致精度损失
            //同时计算后单位必须换算为小时,而不能换算成秒,再在计算速度的时候换算速度,也会导致过不了orz
            public static double TimeCalculation(String lastTime,String nowTime)
            {
                String[] lastTimeStr = lastTime.split(":");
                String[] nowTimeStr = nowTime.split(":");
                double hour = 0;
                for(int i = 0;i < 3;i++)
                {
                    double delta_T = Double.parseDouble(nowTimeStr[i]) - Double.parseDouble(lastTimeStr[i]);
                    hour += delta_T / Math.pow(60,i);
                }
                return hour;
            }
        }
        
        • 1

        信息

        ID
        4
        时间
        1000ms
        内存
        32MiB
        难度
        9
        标签
        (无)
        递交数
        35
        已通过
        4
        上传者