第三题一开始暴力遍历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;
}
}
int main() {
int t;
cin >> t;
int *ans = new int[t];
for (int i = 0; i < t; ++i) {
int k, m;
cin >> k >> m;
int *day = new int[m];
int p = 1;
ans[i] = 0;
for (int j = 0; j < m; ++j) {
cin >> day[j];
while (p < day[i]) {
ans[i]++;
p += k + 1;
}
}
while (p < 31) {
ans[i]++;
p += k + 1;
}
}
for (int i = 0; i < t; ++i)
cout << ans[i] << endl;
return 0;
} 不懂为什么一直是0