第三题一开始暴力遍历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;
}
}