8.28 CSP-S1错题整理
单项选择题
第 20 题 (4 分)
#include <cstdio>
using namespace std;
int n;
int a[100];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
int ans = 1;
for (int i = 1; i <= n; ++i) {
if (i > 1 && a[i] < a[i - 1])
ans = i;
while (ans < n && a[i] >= a[ans + 1])
++ans;
printf("%d", ans);
}
return 0;
}
若输入的 aa 数组是一个严格单调递增的数列,此程序的时间复杂度是
【解析】 当a 数组是一个严格单调递增的数列时,while()
循环一次都不执行,所以程序的时间复杂度是:
O
(
n
)
O(n)
O(n)。
第 21 题 (4 分)
最坏情况下,此程序的时间复杂度为:
【解析】 最坏情况下,当a 数组是一个严格单调递减的数列时,while()会执行n−1,n−2,n−3…,所以程序的时间复杂度是: O ( n 2 ) O(n^2) O(n2)
第 25 题 (1 分)
#include <iostream>
using namespace std;
const int maxn = 1000;
int n;
int fa[maxn], cnt[maxn];
int getRoot(int v) {
if (fa[v] == v) return v;
return getRoot(fa[v]);
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
fa[i] = i;
cnt[i] = 1;
}
int ans = 0;
for (int i = 0; i < n - 1; ++i) {
int a, b, x, y;
cin >> a >> b;
x = getRoot(a);
y = getRoot(b);
ans += cnt[x] * cnt[y];
fa[x] = y;
cnt[y] += cnt[x];
}
cout << ans << endl;
return 0;
}
}
判断正误 若输入的 a 和 b 值均在 [ 0 , n − 1 ] [0, n-1] [0,n−1] 的范围内,则对于任意 0 ≤ i < n 0 \le i<n 0≤i<n,都有 1 ≤ c n t [ i ] ≤ n 1\le cnt[i] \le n 1≤cnt[i]≤n。
当然错了
它合并的时候没有判断