完成下面的判断题和单选题。
1 #include <cstdio> 2 using namespace std; 3 int n; 4 int a[100]; 5 6 int main() { 7 scanf("%d", &n); 8 for (int i = 1; i <= n; ++i) 9 scanf("%d", &a[i]); 10 int ans = 1; 11 for (int i = 1; i <= n; ++i) { 12 if (i > 1 && a[i] < a[i - 1]) 13 ans = i; 14 while (ans < n && a[i] >= a[ans + 1]) 15 ++ans; 16 printf("%d\n", ans); 17 } 18 return 0; 19 }
第 行输出 ans 时,ans 的值一定大于 i。( )
程序输出的 ans 小于等于 。( )
若将第 行的 < 改为 !=,程序输出的结果不会改变。( )
当程序执行到第 行时,若 ans-i>2,则 。( )
若输入的 a 数组是一个严格单调递增的数列,此程序的时间复杂度是( )。
最坏情况下,此程序的时间复杂度是( )。
(4 分)本题中 是 的子序列的意思是:从 中删去若干个字符,可以得到 ;特别的,如果 ,那么 也是 的子序列;空串是任何串的子序列。例如,acd 是 abcde 的子序列,acd 是 acd 的子序列,但 adc 不是 abcde 的子序列。
s[x..y] 表示 s[x]...s[y] 共 个字符构成的字符串,若 则 s[x..y] 是空串。t[x..y] 同理。
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 const int maxl = 202; 5 string s, t; 6 int pre[maxl], suf[maxl]; 7 8 int main() { 9 cin >> s >> t; 10 int slen = s.length(), tlen = t.length(); 11 for (int i = 0, j = 0; i < slen; ++i) { 12 if (j < tlen && s[i] == t[j]) ++j; 13 pre[i] = j; // t[0..j-1]是s[0..i]的子序列 14 } 15 for (int i = slen - 1, j = tlen - 1; i >= 0; --i) { 16 if (j >= 0 && s[i] == t[j]) --j; 17 suf[i] = j; // t[j+1..tlen-1]是s[i..slen-1]的子序列 18 } 19 suf[slen] = tlen - 1; 20 int ans = 0; 21 for (int i = 0, j = 0, tmp = 0; i <= slen; ++i) { 22 while (j <= slen && tmp >= suf[j] + 1) ++j; 23 ans = max(ans, j - i - 1); 24 tmp = pre[i]; 25 } 26 cout << ans << endl; 27 return 0; 28 }
提示:
t[0..pre[i]-1] 是 s[0..i] 的子序列;
t[suf[i]+1..tlen-1] 是 s[i..slen-1] 的子序列。
程序输出时,suf 数组满足:对任意 ,。( )
当 t 是 s 的子序列时,输出一定不为 。( )
程序运行到第 行时,j-i-1 一定不小于 。( )
当 t 是 s 的子序列时,pre 数组和 suf 数组满足:对任意 ,。( )
若 tlen=10,输出为 ,则 slen 最小为( )。
若 tlen=10,输出为 ,则 slen 最小为( )。
1 #include <iostream> 2 using namespace std; 3 4 int n; 5 int d[1000]; 6 7 int main() { 8 cin >> n; 9 for (int i = 0; i < n; ++i) 10 cin >> d[i]; 11 int ans = -1; 12 for (int i = 0; i < n; ++i) 13 for (int j = 0; j < n; ++j) 14 if (d[i] < d[j]) 15 ans = max(ans, d[i] + d[j] - (d[i] & d[j])); 16 cout << ans; 17 return 0; 18 }
假设输入的 和 d[i] 都是不超过 的正整数,完成下面的判断题和单选题。
必须小于 ,否则程序可能会发生运行错误。( )
(1.5 分)输出一定大于等于 。( )
(1.5 分)若将第 行的 j = 0 改为 j = i + 1,程序输出可能会改变。( )
将第 行的 d[i] < d[j] 改为 d[i] != d[j],程序输出不会改变。( )
若输入 为 ,且输出为 ,则输入的 d[i] 中不可能有( )。
若输出的数大于 ,则下面说法正确的是( )。
(3 分)1 #include <iostream> 2 #include <cstdlib> 3 using namespace std; 4 5 int n; 6 int d[10000]; 7 8 int find(int L, int R, int k) { 9 int x = rand() % (R - L + 1) + L; 10 swap(d[L], d[x]); 11 int a = L + 1, b = R; 12 while (a < b) { 13 while (a < b && d[a] < d[L]) 14 ++a; 15 while (a < b && d[b] >= d[L]) 16 --b; 17 swap(d[a], d[b]); 18 } 19 if (d[a] < d[L]) 20 ++a; 21 if (a - L == k) 22 return d[L]; 23 if (a - L < k) 24 return find(a, R, k - (a - L)); 25 return find(L + 1, a - 1, k); 26 } 27 28 int main() { 29 int k; 30 cin >> n; 31 cin >> k; 32 for (int i = 0; i < n; ++i) 33 cin >> d[i]; 34 cout << find(0, n - 1, k); 35 return 0; 36 }
假设输入的 、 和 d[i] 都是不超过 的正整数,且 不超过 ,并假设 rand() 函数产生的是均匀的随机数,完成下面的判断题和单选题。
第 行的 x 的数值范围是 到 ,即 。( )
将第 行的 d[a] 改为 d[b],程序不会发生运行错误。( )
当输入的 d[i] 是严格单调递增序列时,第 行的 swap 平均执行次数是( )。
当输入的 d[i] 是严格单调递减序列时,第 行的 swap 平均执行次数是( )。
若输入的 d[i] 为 ,此程序①平均的时间复杂度和②最坏情况下的时间复杂度分别是( )。
若输入的 d[i] 都为同一个数,此程序平均的时间复杂度是( )。
1 #include <iostream> 2 #include <queue> 3 using namespace std; 4 5 const int maxl = 2000000000; 6 7 class Map { 8 struct item { 9 string key; int value; 10 } d[maxl]; 11 int cnt; 12 public: 13 int find(string x) { 14 for (int i = 0; i < cnt; ++i) 15 if (d[i].key == x) 16 return d[i].value; 17 return -1; 18 } 19 static int end() { return -1; } 20 void insert(string k, int v) { 21 d[cnt].key = k; d[cnt++].value = v; 22 } 23 } s[2]; 24 25 class Queue { 26 string q[maxl]; 27 int head, tail; 28 public: 29 void pop() { ++head; } 30 string front() { return q[head + 1]; } 31 bool empty() { return head == tail; } 32 void push(string x) { q[++tail] = x; } 33 } q[2]; 34 35 string st0, st1; 36 int m; 37 38 string LtoR(string s, int L, int R) { 39 string t = s; 40 char tmp = t[L]; 41 for (int i = L; i < R; ++i) 42 t[i] = t[i + 1]; 43 t[R] = tmp; 44 return t; 45 } 46 47 string RtoL(string s, int L, int R) { 48 string t = s; 49 char tmp = t[R]; 50 for (int i = R; i > L; --i) 51 t[i] = t[i - 1]; 52 t[L] = tmp; 53 return t; 54 } 55 56 bool check(string st, int p, int step) { 57 if (s[p].find(st) != s[p].end()) 58 return false; 59 ++step; 60 if (s[p ^ 1].find(st) == s[p].end()) { 61 s[p].insert(st, step); 62 q[p].push(st); 63 return false; 64 } 65 cout << s[p ^ 1].find(st) + step << endl; 66 return true; 67 } 68 69 int main() { 70 cin >> st0 >> st1; 71 int len = st0.length(); 72 if (len != st1.length()) { 73 cout << -1 << endl; 74 return 0; 75 } 76 if (st0 == st1) { 77 cout << 0 << endl; 78 return 0; 79 } 80 cin >> m; 81 s[0].insert(st0, 0); s[1].insert(st1, 0); 82 q[0].push(st0); q[1].push(st1); 83 for (int p = 0; 84 !(q[0].empty() && q[1].empty()); 85 p ^= 1) { 86 string st = q[p].front(); q[p].pop(); 87 int step = s[p].find(st); 88 if ((p == 0 && 89 (check(LtoR(st, m, len - 1), p, step) || 90 check(RtoL(st, 0, m), p, step))) 91 || 92 (p == 1 && 93 (check(LtoR(st, 0, m), p, step) || 94 check(RtoL(st, m, len - 1), p, step)))) 95 return 0; 96 } 97 cout << -1 << endl; 98 return 0; 99 }
完成下面的判断题和单选题。
输出可能为 。( )
(1.5 分)若输入的两个字符串长度均为 时,则 时的输出与 时的输出是一样的。( )
(1.5 分)若两个字符串的长度均为 ,则最坏情况下,此程序的时间复杂度为 。( )
(1.5 分)若输入的第一个字符串由 个不同的字符构成,第二个字符串是第一个字符串的倒序,输入的 为 ,则输出为( )。
(2.5 分)已知当输入为 0123\n3210\n1 时输出为 ,当输入为 012345\n543210\n1 时输出为 ,当输入为 01234567\n76543210\n1 时输出为 ,则当输入为 0123456789ab\nba9876543210\n1 时输出为( )。其中 \n 为换行符。
若两个字符串的长度均为 ,且 ,且两个字符串的构成相同(即任何一个字符在两个字符串中出现的次数均相同),则下列说法正确的是( )。提示:考虑输入与输出有多少对字符串后顺序不一样。
(4 分)1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 5 const double r = acos(0.5); 6 7 int a1, b1, c1, d1; 8 int a2, b2, c2, d2; 9 10 inline int sq(const int x) { return x * x; } 11 inline int cu(const int x) { return x * x * x; } 12 13 int main() 14 { 15 cout.flags(ios::fixed); 16 cout.precision(4); 17 18 cin >> a1 >> b1 >> c1 >> d1; 19 cin >> a2 >> b2 >> c2 >> d2; 20 21 int t = sq(a1 - a2) + sq(b1 - b2) + sq(c1 - c2); 22 23 if (t <= sq(d2 - d1)) cout << cu(min(d1, d2)) * r * 4; 24 else if (t >= sq(d2 + d1)) cout << 0; 25 else { 26 double x = d1 - (sq(d1) - sq(d2) + t) / sqrt(t) / 2; 27 double y = d2 - (sq(d2) - sq(d1) + t) / sqrt(t) / 2; 28 cout << (x * x * (3 * d1 - x) + y * y * (3 * d2 - y)) * r; 29 } 30 cout << endl; 31 return 0; 32 }
假设输入的所有数的绝对值都不超过 ,完成下面的判断题和单选题。
将第 行中 t 的类型声明从 int 改为 double,不会影响程序运行的结果。( )
将第 、 行中的 / sqrt(t) / 2 替换为 / 2 / sqrt(t),不会影响程序运行的结果。( )
将第 行中的 x * x 改成 sq(x)、y * y 改成 sq(y),不会影响程序运行的结果。( )
当输入为 0 0 0 1 1 0 0 1 时,输出为 1.3090。( )
当输入为 1 1 1 1 1 1 1 2 时,输出为( )。
这段代码的含义为( )。
(2.5 分)1 #include <algorithm> 2 #include <iostream> 3 using namespace std; 4 5 int n, a[1005]; 6 7 struct Node 8 { 9 int h, j, m, w; 10 11 Node(const int _h, const int _j, const int _m, const int _w): 12 h(_h), j(_j), m(_m), w(_w) 13 { } 14 15 Node operator+(const Node &o) const 16 { 17 return Node( 18 max(h, w + o.h), 19 max(max(j, o.j), m + o.h), 20 max(m + o.w, o.m), 21 w + o.w); 22 } 23 }; 24 25 Node solve1(int h, int m) 26 { 27 if (h > m) 28 return Node(-1, -1, -1, -1); 29 if (h == m) 30 return Node(max(a[h], 0), max(a[h], 0), max(a[h], 0), a[h]); 31 int j = (h + m) >> 1; 32 return solve1(h, j) + solve1(j + 1, m); 33 } 34 35 int solve2(int h, int m) 36 { 37 if (h > m) 38 return -1; 39 if (h == m) 40 return max(a[h], 0); 41 int j = (h + m) >> 1; 42 int wh = 0, wm = 0; 43 int wht = 0, wmt = 0; 44 for (int i = j; i >= h; i--) { 45 wht += a[i]; 46 wh = max(wh, wht); 47 } 48 for (int i = j + 1; i <= m; i++) { 49 wmt += a[i]; 50 wm = max(wm, wmt); 51 } 52 return max(max(solve2(h, j), solve2(j + 1, m)), wh + wm); 53 } 54 55 int main() 56 { 57 cin >> n; 58 for (int i = 1; i <= n; i++) cin >> a[i]; 59 cout << solve1(1, n).j << endl; 60 cout << solve2(1, n) << endl; 61 return 0; 62 }
假设输入的所有数的绝对值都不超过 ,完成下面的判断题和单选题。
程序总是会正常执行并输出两行两个相等的数。( )
(1.5 分)第 行与第 行分别有可能执行两次及以上。( )
(1.5 分)当输入为 5 -10 11 -9 5 -7 时,输出的第二行为 7。( )
solve1(1, n) 的时间复杂度为( )。
solve2(1, n) 的时间复杂度为( )。
当输入为 10 -3 2 10 0 -8 9 -4 -5 9 4 时,输出的第一行为( )。
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 5 using namespace std; 6 7 int f(const string &s, const string &t) 8 { 9 int n = s.length(), m = t.length(); 10 11 vector<int> shift(128, m + 1); 12 13 int i, j; 14 15 for (j = 0; j < m; j++) 16 shift[t[j]] = m - j; 17 18 for (i = 0; i <= n - m; i += shift[s[i + m]]) { 19 j = 0; 20 while (j < m && s[i + j] == t[j]) j++; 21 if (j == m) return i; 22 } 23 24 return -1; 25 } 26 27 int main() 28 { 29 string a, b; 30 cin >> a >> b; 31 cout << f(a, b) << endl; 32 return 0; 33 }
假设输入字符串由 ASCII 可见字符组成,完成下面的判断题和单选题。
当输入为 abcde fg 时,输出为 -1。( )
当输入为 abbababbbab abab 时,输出为 4。( )
当输入为 GoodLuckCsp2022 22 时,第 行的 j++ 语句执行次数为 。( )
该算法最坏情况下的时间复杂度为( )。
(3 分)f(a, b) 与下列( )语句的功能最类似。
当输入为 baaabaaabaaabaaaa aaaa 时,第 行的 j++ 语句执行次数为( )。
1 #include <iostream> 2 3 using namespace std; 4 5 const int MAXN = 105; 6 7 int n, m, k, val[MAXN]; 8 int temp[MAXN], cnt[MAXN]; 9 10 void init() 11 { 12 cin >> n >> k; 13 for (int i = 0; i < n; i++) cin >> val[i]; 14 int maximum = val[0]; 15 for (int i = 1; i < n; i++) 16 if (val[i] > maximum) maximum = val[i]; 17 m = 1; 18 while (maximum >= k) { 19 maximum /= k; 20 m++; 21 } 22 } 23 24 void solve() 25 { 26 int base = 1; 27 for (int i = 0; i < m; i++) { 28 for (int j = 0; j < k; j++) cnt[j] = 0; 29 for (int j = 0; j < n; j++) cnt[val[j] / base % k]++; 30 for (int j = 1; j < k; j++) cnt[j] += cnt[j - 1]; 31 for (int j = n - 1; j >= 0; j--) { 32 temp[cnt[val[j] / base % k] - 1] = val[j]; 33 cnt[val[j] / base % k]--; 34 } 35 for (int j = 0; j < n; j++) val[j] = temp[j]; 36 base *= k; 37 } 38 } 39 40 int main() 41 { 42 init(); 43 solve(); 44 for (int i = 0; i < n; i++) cout << val[i] << ' '; 45 cout << endl; 46 return 0; 47 }
假设输入的 为不大于 的正整数, 为不小于 且不大于 的正整数,val[i] 在 int 表示范围内,完成下面的判断题和单选题。
这是一个不稳定的排序算法。( )
(1.5 分)该算法的空间复杂度仅与 有关。( )
(1.5 分)该算法的时间复杂度为 。( )
(1.5 分)当输入为 5 3 98 26 91 37 46 时,程序第一次执行到第 行,val[] 数组的内容依次为( )。
若 val[i] 的最大值为 , 取( )时算法运算次数最少。
当输入的 比 val[i] 的最大值还大时,该算法退化为( )算法。
1 #include <iostream> 2 #include <algorithm> 3 4 using namespace std; 5 6 const int MAXL = 1000; 7 8 int n, k, ans[MAXL]; 9 10 int main(void) 11 { 12 cin >> n >> k; 13 if (!n) cout << 0 << endl; 14 else 15 { 16 int m = 0; 17 while (n) 18 { 19 ans[m++] = (n % (-k) + k) % k; 20 n = (ans[m - 1] - n) / k; 21 } 22 for (int i = m - 1; i >= 0; i--) 23 cout << char(ans[i] >= 10 ? 24 ans[i] + 'A' - 10 : 25 ans[i] + '0'); 26 cout << endl; 27 } 28 return 0; 29 }
假设输入的 在 int 范围内, 为不小于 且不大于 的正整数,完成下面的判断题和单选题。
该算法的时间复杂度为 。( )
(1.5 分)删除第 行的强制类型转换,程序的行为不变。( )
(1.5 分)除非输入的 为 ,否则程序输出的字符数为 。( )
(1.5 分)当输入为 100 7 时,输出为( )。
当输入为 -255 8 时,输出为( )。
当输入为 1000000 19 时,输出为( )。
1 #include <iostream> 2 using namespace std; 3 4 unsigned short f(unsigned short x) { 5 x ^= x << 6; 6 x ^= x >> 8; 7 return x; 8 } 9 10 int main() { 11 unsigned short x; 12 cin >> x; 13 unsigned short y = f(x); 14 cout << y <<endl; 15 return 0; 16 }
假设输入的 是不超过 的自然数,完成下面的判断题和单选题。
当输入非零时,输出一定不为零。( )
(1.5 分)将 f 函数的输入参数类型改为 unsigned int,程序的输出不变。( )
当输入为 65535 时,输出为 63。( )
当输入为 1 时,输出为 64。( )
当输入为 512 时,输出为( )。
当输入为 64 时,执行完第 行后 x 的值为( )。