#include<stdio.h> using namespace std; #include<cstring> #include <string.h> #include <stdbool.h> #pragma warning(disable:4996) int main() { int A[2005], Z[105] = {0}; int T, i, j, k, N, x,m; scanf("%d %d", &N, &x); for (i = 0; i < N; i++) { scanf("%d", A+i); } for (i = 0; i < N; i++) { A[i]--; } scanf("%d", &T); for (i = 0; i < T; i++) { memset(Z, 0, sizeof(Z)); scanf("%d %d", &k, &m); for (j=0,k--, m--; k <= m; k++) Z[A[k]] ? 0 : ((Z[A[k]] = 1), j++); printf("%d\n", j); } return 0; }
时间: 2024-03-25 20:37:51 浏览: 17
这段代码的问题不太明显,但是有几个可以进行优化的地方:
1. 删除无用的头文件:这段代码中包含了很多无用的头文件,可以删除它们,以减少编译时间和代码冗余。
2. 减少重复的代码:这段代码中出现了两次对输入数组 A 进行遍历的循环,可以将它们合并为一次。
3. 使用 const 关键字:如果数组 A 不需要被修改,可以将其声明为 const 数组,以提高代码的可读性和安全性。
4. 简化判断条件:在循环中进行判断时,可以将判断语句简化为更简洁的形式,以提高代码的可读性和效率。
5. 避免使用 magic number:代码中出现了一些硬编码的数字,可以使用 const 变量或宏定义来代替,以提高代码的可维护性。
下面是进行优化后的代码:
```
#include <cstdio>
#include <cstring>
const int MAX_N = 2005;
const int MAX_M = 105;
int main() {
int A[MAX_N], Z[MAX_M] = {0};
int T, N, x;
scanf("%d %d", &N, &x);
for (int i = 0; i < N; i++) {
scanf("%d", &A[i]);
A[i]--; // 将 A 数组中的元素都减 1
}
scanf("%d", &T);
for (int i = 0; i < T; i++) {
memset(Z, 0, sizeof(Z));
int k, m;
scanf("%d %d", &k, &m);
int cnt = 0;
for (int j = k - 1; j <= m - 1; j++) {
if (!Z[A[j]]) {
Z[A[j]] = 1;
cnt++;
}
}
printf("%d\n", cnt);
}
return 0;
}
```
这样修改后的代码更加简洁明了,可读性和可维护性都有所提高。