#3820. 2611 DC9阶段测试(选择题)

2611 DC9阶段测试(选择题)

第 1 题

“没有上司的舞会”中,f[x][1] 表示 x 参加时子树的最大快乐值,f[x][0] 表示 x 不参加时的最大快乐值,y 是 x 的儿子。f[x][0] 的转移是(  )

{{ select(1) }}

  • f[x][0] = Σ f[y][0]
  • f[x][0] = Σ max(f[y][0], f[y][1])
  • f[x][0] = Σ f[y][1]
  • f[x][0] = r[x] + Σ f[y][0]

第 2 题

“选课”用树上背包:f[x][j] 表示在 x 的子树里选 j 门课(x 必须选)的最大学分。合并儿子 y 时写成

for (int j = n + 1; j >= 2; j--)
    for (int k = 1; k <= j - 1; k++)
        f[x][j] = max(f[x][j], f[x][j - k] + f[y][k]);

其中 j 从大到小枚举的原因是(  )

{{ select(2) }}

  • 让程序跑得更快
  • 防止数组下标越界
  • 保证 f[x][0] 的值正确
  • 保证同一棵子树 y 只被用一次(和 01 背包倒序是同一个道理)

第 3 题

状压 DP 中,用二进制数 S 表示一行里哪些格子放了东西。“这一行没有两个相邻的格子都放了东西”的判断是(  )

{{ select(3) }}

  • (S & (S << 1)) == 0
  • (S | (S << 1)) == 0
  • (S ^ (S >> 1)) == 0
  • (S & (S - 1)) == 0

第 4 题

“最短 Hamilton 路径”n = 20,开数组 int f[1 << 20][20],这个数组大约占(  )内存

{{ select(4) }}

  • 8 MB
  • 20 MB
  • 80 MB
  • 800 MB

第 5 题

“互不侵犯”中,国王会攻击周围 8 个格子。上一行状态 a、这一行状态 b,两行之间互不攻击的条件是(  )

{{ select(5) }}

  • (a & b) == 0
  • (a & b) == 0 && (a & (b << 1)) == 0 && (a & (b >> 1)) == 0
  • (a | b) == 0
  • (a & (b << 1)) == 0 && (a & (b >> 1)) == 0

第 6 题

数位 DP 求区间 [X, Y] 里满足条件的数有多少个。设 calc(n) 表示 [0, n] 里满足条件的个数,答案是(  )

{{ select(6) }}

  • calc(Y) - calc(X - 1)
  • calc(Y) - calc(X)
  • calc(Y - X)
  • calc(Y) - calc(X) + 1

第 7 题

统计 Windy 数(相邻两位数字之差至少为 2)时要单独处理前导零。原因是(  )

{{ select(7) }}

  • 前导零会让数组越界
  • 不处理的话会把 0 算进答案
  • 例如 13 补成 013 后,0 和 1 相差 1,会被误判成不是 Windy 数
  • 前导零会让答案多出一倍

第 8 题

“奶牛玩杂技”:每头牛有体重 w 和力量 s,叠成一列,一头牛的压扁指数 = 它上面所有牛的体重和 − 它的 s。要让最大的压扁指数最小,从上到下的顺序应该是(  )

{{ select(8) }}

  • 按 w 从小到大
  • 按 s 从大到小
  • 按 w + s 从小到大
  • 按 w − s 从小到大

第 9 题

“任务与期限”:n 个任务都要做,第 i 个耗时 a[i]、期限 d[i],完成时刻为 f 时得 d[i] − f 分(可以是负数),求总分最大。正确的贪心是(  )

{{ select(9) }}

  • 按期限 d 从小到大做
  • 按耗时 a 从小到大做
  • 按 d − a 从大到小做
  • 按耗时 a 从大到小做

第 10 题

“无法组成的最小金额”:硬币面值是 1、2、4、9(每种一枚),不能凑出的最小正整数金额是(  )

{{ select(10) }}

  • 3
  • 5
  • 7
  • 8