第三题一开始暴力遍历30天,结果用例过了,但是提交超时。优化了一下就过了,没搞懂第二种为什么过,复杂度不都是o(n)? 超时的写法 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();   } } 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;   } }
点赞 评论

相关推荐

04-06 11:24
已编辑
太原学院 C++
真烦好烦真烦:感觉不太对劲,这种主动加微信的一般都是坑,要小心辨别
点赞 评论 收藏
分享
我就是0offer糕手:北大不乱杀
点赞 评论 收藏
分享
牛客网
牛客企业服务