今天做了一张模拟卷

错了几道题

1:有一个n行m列的网格图,每个格子有一个非负整数权值a[i][j]。现在要从右上角 (1, m) 走到左下角 (n, 1),只能向左或向下走,每次走一格,路径上的权值和为路径上所有格子的权值和。以下哪个递推式可以求解从右上角到左下角的最小权值和?()。

A:f(i, j) = min(f(i-1, j), f(i, j-1)) + a[i][j]

B:f(i, j) = max(f(i-1, j), f(i, j-1)) + a[i][j]

C:f(i, j) = min(f(i-1, j), f(i, j+1)) + a[i][j]

D:f(i, j) = max(f(i-1, j), f(i, j+1)) + a[i][j]

因为要求最小值,所以排除B和D。然后因为只能往左或往下走一步,所以要到a[i][j]号格子只能从它的上面或右边过来

2:

4)当输入的 n 为 100 时,输出的最大值为 50×50×31。( )

A. 正确

B. 错误

100个数中最多有50个1和50个0,然后因为按位取反之后首位也会取反所以会少一位,也就是30位。

单选题: 5)如果输入是:

4
8 6 4 3

则输出是: A. 14

B. 12

C. 10

D. 0

输入的数据为8 6 4 3也就是二进制下的1000 110 100 11。通过g函数按位取反后是0111 001 011 0带入主函数中的每位上0和1的乘积的和是10

3:

3)如果将第10行代码中的i >= 1修改为 i > 1,一定只输出一行。

A. 正确

B. 错误

因为i>1的话,x=1的递归调用就进不去循环,不能进行递归调用

5)输入 5,输出的第 115行是( )。

A. 5 3 2 4 1

B. 5 3 4 2 1

C. 5 4 2 3 1

D. 5 2 4 3 1

6)输入 6,输出的第 365行是( )。

A. 2 6 1 3 4 5

B. 3 4 6 1 2 5

C. 3 1 6 5 2 4

D. 2 1 4 3 5 6

4:

1.①处应填 ( )

A. a[j] *= p

B. a[j] *= q

C. a[j] *= pow(p, i)

D. a[j] *= pow(q, i)

这里是要

  1. ②处应填 ( )

A. a[j] += a[j - 1] / q

B. a[j + 1] += a[j] / q

C. if (j) a[j] += a[j - 1] / q

D. if (j) a[j + 1] += a[j] / q

到这里已经把每一位p进制转换成了对应的10进制。因为有可能有超过10的数,所以要考虑进位。第i位等于第i-1位的进位加上原本的值。因为是从零开始的,所以排除A,C和D。

  1. ③处应填 ( )

A. if (j) a[j - 1] /= q

B. if (j) a[j - 1] %= q

C. if (j) a[j] %= q

D. a[j] %= q

进位完了,要把个位数留下,也就是%10。因为是从0开始的,所以A,B,C都要排除。

  1. ④处应填 ( )

A. a[len]

B. a[len] / q

C. a[len - 1]

D. a[len - 1] / q

这段代码要实现10进制转q进制。所以它的条件是a[len]!=0,也就是a[len]。

  1. ⑤处应填 ( )

A. a[len] += a[len - 1] % q

B. a[len] += a[len - 1] / q

C. a[len + 1] += a[len] % q

D. a[len + 1] += a[len] / q

这里是算进位的。因为是从0开始,所以排除A跟B。然后,因为进位要取十位而不是个位,所以是D。