共63道题,当前是第51

Description

1	#include 
2	using namespace std;
3	char s[1000];
4	int f[1000][8], n, x, y;
5	int Log2(int x) {
6	    int a = 0, b = 1;
7	    while (b*2 <= x) {
8	        a ++;
9	        b *= 2;
10	    }
11	   return a;
12	}
13	int main() {
14	    cin >> s >> x >> y;
15	    n = strlen(s);
16	    for (int i = 0; i < n; i++)
17	        f[i][0] = s[i];
18	    for (int i = 1; (1 << i) <= n; i++)
19	        for (int j = 0; j+(1 << i)-1 < n; j++)
20	            f[j][i] = max(f[j][i-1], f[j+(1 << i-1)][i-1]);
21	    int z = Log2(y-x+1);
22	    cout << (char)max(f[x][z], f[y-(1 << z)+1][z]) << endl;
23	    return 0;
24	}

本题基于倍增思想构造 $ST$ 表求解 $RMQ$ 问题,输出 $s[x]$ 到 $s[y]$ 中 $ASCII$ 码最大的那个字符。

1. 错误。解析:当输入为 `CGFCDBAE 2 6` 时,输出为 `F`。需要注意的是——数组下标从 $0$ 开始计算。
2. 正确。解析:因为 $f$ 数组的第二维只开了 $8$ 的大小,所以虽然第一维的大小是 $1000$,但是只要 $n$ 大于 $27=128$ 时,计算 $f$ 数组元素时就会发生数组越界。
3. 错误。解析:因为 $ST$ 表需要先计算所有的 $f[i][0]$,再由f[i][0]推导出所有的 $f[i][1]$,再由 $f[i][1]$ 推导出所有的 $f[i][2]$,所以代码第 $19$ 行和 $20$ 行的代码的顺序不能改变。
4. B。解析:函数 $Log2(x)$ 返回的是 $⌊log2x⌋$的结果(其中 $⌊x⌋$ 表示 $x$ 向下取整),所以 $Log2(x)$ 的返回值是 $3$。
5. D。解析: `HETAOACCEP` 中 $ASCII$ 码最大的字符是 `T`。
6. B。解析: `InHETAO` 中 $ASCII$ 码最大的字符是 `n`,需要注意的是小写英文字母的 $ASCII$ 码都大于大写英文字母

Question

当输入为 `CGFCDBAE 2 6`时,输出为 `G`。( )

当输入的第一个字符串的长度为 $500$ 时,会发生数组越界。( )

交换第 $19$ 行和第 $20$ 行的代码并不会影响程序的输出结果。( )

$Log2(15)$的返回值为( )。

当输入为 `HETAOACCEPT 0 9` 时,输出结果为( )。

当输入为 `CodeInHETAO 4 10` 时,输出结果为( )。