⌨️选数 I(baidu)
题目描述
-
题目:给定整数
1
到n
的范围,要求从中选择k
个数,计算能够获得的最大积分。计分规则如下:初始积分为0
,每当选取的整数i
满足i+1
未被选取时,积分增加1
。-
输入描述:第一行输入一个整数
T
(),表示测试数据的组数。接下来的T
行中,每行包含两个整数n
和k
(),分别表示整数的范围和需要选取的个数。 -
输出描述:对于每组测试数据,输出一个整数,表示该组测试数据下所能获得的最大积分。
-
-
输入输出示例
-
输入
1
2
32
1 1
4 2 -
输出
1
21
2
-
解题思想
-
问题分析
- 核心规则:为了获得最大积分,最优的策略是尽量让所选的数字相互隔开。
- 案例分析-1
- 当
n = 4
且k <= 2
,我们可以按照[√, ×, √, ×]
或[×, √, ×, √]
的方式选取,这两种方式都能获得最大积分,即k
。 - 当
n = 5
且k <= 3
,我们可以按照[√, ×, √, ×, √]
的方式选取,获得最大积分为k
。 - 推广可得,如果 ,可以保证每个选择的数字隔相互开,此时最大积分等于
k
。
- 当
- 案例分析-2
- 当
n = 4
且k > 2
,我们可以 ① 先按照[√, ×, √, ×]
的方式选取2
个数字;② 再从后向前选择剩下的k - 2
个数字。在 ① 时,我们获取积分为2
;在 ② 时,选中第一个未被选中的数字时积分不变,从第二个开始,每选中一个数字,积分在当前积分的基础上减1
。 - 当
n = 5
且k > 3
时,我们可以 ① 先按照[√, ×, √, ×, √]
的方式选取3
个数字;② 再从后向前选择剩下的k - 3
个数字。在 ① 时,我们获取积分为3
;在 ② 时,每选中一个数字,积分在当前积分的基础上减1
。 - 推广可得,如果 ,当
n
是偶数时,最大积分等于 ,当n
是奇数时,最大积分等于 。
- 当
-
积分计算公式
其中, 表示在最优选取方式下,最多可以选取 个数字以获得满分。也就是说,当 且取值为 时,可以达到最大的积分。
-
时间复杂度:对每组测试数据 ,时间复杂度为 。
代码实现
1 | export default function maxScore(n, k) { |
单元测试
1 | import { describe, test } from "node:test"; |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 川一土的博客视界!
评论