第三题一开始暴力遍历30天,结果用例过了,但是提交超时。优化了一下就过了,没搞懂第二种为什么过,复杂度不都是o(n)?
  1. 超时的写法
    import java.util.Scanner;
    
    public class Main {
    
      private static final byte TEST = 1;
      private static final String INPUT =
          "4\n"
              + "0 10\n"
              + "1 2 3 4 5 6 7 8 9 10\n"
              + "1 15\n"
              + "1 3 5 7 9 11 13 15 17 19 21 23 25 27 29\n"
              + "1 7\n"
              + "5 9 13 17 21 25 29\n"
              + "1 0\n"
              + "\n";
    
      public static void main(String[] args) {
        Scanner scanner = TEST == 1 ? new Scanner(INPUT) : new Scanner(System.in);
        int t = scanner.nextInt();
        for (int i = 0; i < t; i++) {
          int k = scanner.nextInt();
          int m = scanner.nextInt();
          scanner.nextLine();
          int[] day = new int[31];
          int count = m;
          for (int j = 0; j < m; j++) {
            int d = scanner.nextInt();
            day[d] = 1;
            int left = d - k > 0 ? d - k : 0;
            int right = d + k < 30 ? d + k : 30;
            for (int q = left; q <= right; q++) {
              if (day[q] != 1) {
                day[q] = 2;
              }
            }
          }
          scanner.nextLine();
          int cur = 1;
          while (cur <= 30) {
            if (day[cur] == 0) {
              if (cur + k <= 30 && day[cur + k] != 1) {
                count++;
                cur += k + 1;
              }
            } else {
              cur++;
            }
          }
          System.out.println(count);
        }
        //    }
    
        scanner.close();
      }
    }
    

  2. AC的写法
    import java.util.Scanner;
    
    public class Main {
    
      private static final byte TEST = 0;
      private static final String INPUT =
          "4\n"
              + "0 10\n"
              + "1 2 3 4 5 6 7 8 9 10\n"
              + "1 15\n"
              + "1 3 5 7 9 11 13 15 17 19 21 23 25 27 29\n"
              + "1 7\n"
              + "5 9 13 17 21 25 29\n"
              + "1 0\n"
              + "\n";
    
      public static void main(String[] args) {
        Scanner scanner = TEST == 1 ? new Scanner(INPUT) : new Scanner(System.in);
        int t = scanner.nextInt();
        for (int i = 0; i < t; i++) {
          int k = scanner.nextInt();
          int m = scanner.nextInt();
          int[] num = new int[m + 1];
          num[m] = 31 + k;
          for (int j = 0; j < m; j++) {
            num[j] = scanner.nextInt();
          }
          System.out.println(solve(k, m, num));
        }
        scanner.close();
      }
    
      private static int solve(int k, int m, int[] num) {
        int count = m;
        int cur = 1;
        for (int i = 0; i <= m; i++) {
          if (cur <= num[i]) {
    
            int tmp = (num[i] - cur) / (k + 1);
            cur = num[i] + k + 1;
            count += tmp;
          } else if (cur > 30) {
            break;
          }
        }
        return count;
      }
    }