【题解】Crossing River
【题目描述】
几个人过河,每次过两人一人回,速度由慢者决定,问过河所需最短时间。
【输入描述】
输入t组数据,每组数据第1行输入n,第2行输入n个数,表示每个人过河的时间。
【输出描述】
输出t行数据,每行1个数,表示每组过河最少时间。
【样例1输入】
1 4 1 2 5 10
【样例1输出】
17
【题目描述】
几个人过河,每次过两人一人回,速度由慢者决定,问过河所需最短时间。
【输入描述】
输入t组数据,每组数据第1行输入n,第2行输入n个数,表示每个人过河的时间。
【输出描述】
输出t行数据,每行1个数,表示每组过河最少时间。
【样例1输入】
1 4 1 2 5 10
【样例1输出】
17
【题目描述】
你正在参加一场比赛,给你两个 正 整数 initialEnergy
和 initialExperience
分别表示你的初始精力和初始经验。
另给你两个下标从 0 开始的整数数组 energy
和 experience
,长度均为 n
。
你将会 依次 对上 n
个对手。第 i
个对手的精力和经验分别用 energy[i]
和 experience[i]
表示。当你对上对手时,需要在经验和精力上都 严格 超过对手才能击败他们,然后在可能的情况下继续对上下一个对手。
击败第 i
个对手会使你的经验 增加 experience[i]
,但会将你的精力 减少 energy[i]
。
在开始比赛前,你可以训练几个小时。每训练一个小时,你可以选择将增加经验增加 1 或者 将精力增加 1 。
返回击败全部 n
个对手需要训练的 最少 小时数目。
【输入描述】
第一行3个数,分别表示initialEnergy、initialExperience和长度n
第二行n个数,表示energy,精力
第三行n个数,表示experience,经验数组
【输出描述】
一行,表示训练最少小时数
【样例1输入】
5 3 4 1 4 3 2 2 6 3 1
【样例1输出】
8
【样例1解释】
在 6 小时训练后,你可以将精力提高到 11 ,并且再训练 2 个小时将经验提高到 5 。 按以下顺序与对手比赛: - 你的精力与经验都超过第 0 个对手,所以获胜。 精力变为:11 - 1 = 10 ,经验变为:5 + 2 = 7 。 - 你的精力与经验都超过第 1 个对手,所以获胜。 精力变为:10 - 4 = 6 ,经验变为:7 + 6 = 13 。 - 你的精力与经验都超过第 2 个对手,所以获胜。 精力变为:6 - 3 = 3 ,经验变为:13 + 3 = 16 。 - 你的精力与经验都超过第 3 个对手,所以获胜。 精力变为:3 - 2 = 1 ,经验变为:16 + 1 = 17 。 在比赛前进行了 8 小时训练,所以返回 8 。 可以证明不存在更小的答案。
【样例2输入】
2 4 1 1 3
【样例2输出】
0
【样例2解释】
你不需要额外的精力和经验就可以赢得比赛,所以返回 0 。
【题目描述】
现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 2
杯 不同 类型的水或者 1
杯任意类型的水。
给你一个下标从 0 开始、长度为 3
的整数数组 amount
,其中 amount[0]
、amount[1]
和 amount[2]
分别表示需要装满冷水、温水和热水的杯子数量。返回装满所有杯子所需的 最少 秒数。
【输入描述】
一行,3个数,分别表示需要装满冷水、温水和热水的杯子数量。
【输出描述】
一行一个数,所需的最少秒数
【样例1输入】
1 4 2
【样例1输出】
4
【样例1解释】
下面给出一种方案: 第 1 秒:装满一杯冷水和一杯温水。 第 2 秒:装满一杯温水和一杯热水。 第 3 秒:装满一杯温水和一杯热水。 第 4 秒:装满一杯温水。 可以证明最少需要 4 秒才能装满所有杯子。
【样例2输入】
5 4 4
【样例2输出】
7
【样例2解释】
下面给出一种方案: 第 1 秒:装满一杯冷水和一杯热水。 第 2 秒:装满一杯冷水和一杯温水。 第 3 秒:装满一杯冷水和一杯温水。 第 4 秒:装满一杯温水和一杯热水。 第 5 秒:装满一杯冷水和一杯热水。 第 6 秒:装满一杯冷水和一杯温水。 第 7 秒:装满一杯热水。
【样例3输入】
5 0 0
【样例3输出】
5
【样例3解释】
每秒装满一杯冷水
【题目描述】
一个房间里有 n
个 空闲 座位和 n
名 站着的 学生,房间用一个数轴表示。给你一个长度为 n
的数组 seats
,其中 seats[i]
是第 i
个座位的位置。同时给你一个长度为 n
的数组 students
,其中 students[j]
是第 j
位学生的位置。
你可以执行以下操作任意次:
增加或者减少第 i
位学生的位置,每次变化量为 1
(也就是将第 i
位学生从位置 x
移动到 x + 1
或者 x - 1
)
请你返回使所有学生都有座位坐的 最少移动次数 ,并确保没有两位学生的座位相同。
请注意,初始时有可能有多个座位或者多位学生在 同一 位置。
【输入描述】
三行,第一行一个数n,表示有n个空格和n名同学。
第二行n个数,表示n个座位
第三行n个数,表示n个学生
【输出描述】
一行一个数,表示最少移动次数。
【样例1输入】
3 3 1 5 2 7 4
【样例1输出】
4
【样例1解释】
学生移动方式如下: - 第一位学生从位置 2 移动到位置 1 ,移动 1 次。 - 第二位学生从位置 7 移动到位置 5 ,移动 2 次。 - 第三位学生从位置 4 移动到位置 3 ,移动 1 次。 总共 1 + 2 + 1 = 4 次移动。
【样例2输入】
4 4 1 5 9 1 3 2 6
【样例2输出】
7
【样例2解释】
学生移动方式如下: - 第一位学生不移动。 - 第二位学生从位置 3 移动到位置 4 ,移动 1 次。 - 第三位学生从位置 2 移动到位置 5 ,移动 3 次。 - 第四位学生从位置 6 移动到位置 9 ,移动 3 次。 总共 0 + 1 + 3 + 3 = 7 次移动。
【样例3输入】
4 2 2 6 6 1 3 2 6
【样例3输出】
4
【样例3解释】
学生移动方式如下: - 第一位学生从位置 1 移动到位置 2 ,移动 1 次。 - 第二位学生从位置 3 移动到位置 6 ,移动 3 次。 - 第三位学生不移动。 - 第四位学生不移动。 总共 1 + 3 + 0 + 0 = 4 次移动。
【数据范围】
n == seats.length == students.length
1 <= n <= 100
1 <= seats[i], students[j] <= 100
【题目描述】
给你一个字符串 s
,由 n
个字符组成,每个字符不是 'X'
就是 'O'
。
一次 操作 定义为从 s
中选出 三个连续字符 并将选中的每个字符都转换为 'O'
。注意,如果字符已经是 'O'
,只需要保持 不变 。
返回将 s
中所有字符均转换为 'O'
需要执行的 最少 操作次数。
【输入描述】
一行字符串,由XO构成
【输出描述】
一行一个数,表示最少操作次数
【样例1输入】
XXX
【样例1输出】
1
【样例1解释】
XXX -> OOO 一次操作,选中全部 3 个字符,并将它们转换为 'O' 。
【样例2输入】
XXOX
【样例2输出】
2
【样例2解释】
XXOX -> OOOX -> OOOO 第一次操作,选择前 3 个字符,并将这些字符转换为 'O' 。 然后,选中后 3 个字符,并执行转换。最终得到的字符串全由字符 'O' 组成。
【样例3输入】
OOOO
【样例3输出】
0
【样例3解释】
不存在需要转换的 'X' 。
【题目描述】
给你一个整数数组 nums
(下标从 0 开始)。每一次操作中,你可以选择数组中一个元素,并将它增加 1
。
比方说,如果 nums = [1,2,3]
,你可以选择增加 nums[1]
得到 nums = [1,3,3]
。
请你返回使 nums
严格递增 的 最少 操作次数。
我们称数组 nums
是 严格递增的 ,当它满足对于所有的 0 <= i < nums.length - 1
都有 nums[i] < nums[i+1]
。一个长度为 1
的数组是严格递增的一种特殊情况。
【输入描述】
一行,表示nums数组,每个数用空格隔开。
【输出描述】
一行,表示最少操作次数。
【样例1输入】
1 1 1
【样例1输出】
3
【样例1解释】
解释:你可以进行如下操作: 1) 增加 nums[2] ,数组变为 [1,1,2] 。 2) 增加 nums[1] ,数组变为 [1,2,2] 。 3) 增加 nums[2] ,数组变为 [1,2,3] 。
【样例2输入】
1 5 2 4 1
【样例2输出】
14
【样例3输入】
8
【样例3输出】
0
【题目描述】
给你一个数组 nums
,请你从中抽取一个子序列,满足该子序列的元素之和 严格 大于未包含在该子序列中的各元素之和。
如果存在多个解决方案,只需返回 长度最小 的子序列。如果仍然有多个解决方案,则返回 元素之和最大 的子序列。
与子数组不同的地方在于,「数组的子序列」不强调元素在原数组中的连续性,也就是说,它可以通过从数组中分离一些(也可能不分离)元素得到。
注意,题目数据保证满足所有约束条件的解决方案是 唯一 的。同时,返回的答案应当按 非递增顺序 排列。
【输入描述】
包含一行,每个数用空格隔开。
【输出描述】
包含一行,满足条件的子序列。每个数用空格隔开。
【样例1输入】
4 3 10 9 8
【样例1输出】
10 9
【样例1解释】
子序列 [10,9] 和 [10,8] 是最小的、满足元素之和大于其他各元素之和的子序列。但是 [10,9] 的元素之和最大。
【样例2输入】
4 4 7 6 7
【样例2输出】
7 7 6
【样例2解释】
子序列 [7,7] 的和为 14 ,不严格大于剩下的其他元素之和(14 = 4 + 4 + 6)。因此,[7,6,7] 是满足题意的最小子序列。注意,元素按非递增顺序返回。
【提示】
1 <= nums.length <= 500
1 <= nums[i] <= 100
【题目描述】
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 flowerbed
表示花坛,由若干 0
和 1
组成,其中 0
表示没种植花,1
表示种植了花。另有一个数 n
,能否在不打破种植规则的情况下种入 n
朵花?能则返回 true
,不能则返回 false
。
【输入描述】
两行,第一行表示flowerbed,
第二行一个数n,表示要种入n朵花
【输出描述】
一行,true或者false
【样例1输入】
1 0 0 0 1 1
【样例1输出】
true
【样例2输入】
1 0 0 0 1 2
【样例2输出】
false
【提示】
1 <= flowerbed.length <= 2 * 104
flowerbed[i]
为 0
或 1
flowerbed
中不存在相邻的两朵花
0 <= n <= flowerbed.length
【题目描述】
给你一个下标从 0 开始的整数数组 players
,其中 players[i]
表示第 i
名运动员的 能力 值,同时给你一个下标从 0 开始的整数数组 trainers
,其中 trainers[j]
表示第 j
名训练师的 训练能力值 。
如果第 i
名运动员的能力值 小于等于 第 j
名训练师的能力值,那么第 i
名运动员可以 匹配 第 j
名训练师。除此以外,每名运动员至多可以匹配一位训练师,每位训练师最多可以匹配一位运动员。
请你返回满足上述要求 players
和 trainers
的 最大 匹配数。
【输入描述】
3行,第一行m和n表示运动员和训练师
第二行是m个运动员的能力值,
第三行是n个训练师的训练值
【输出描述】
最大匹配数
【样例1输入】
3 4 4 7 9 8 2 5 8
【样例1输出】
2
【样例1解释】
得到两个匹配的一种方案是: - players[0] 与 trainers[0] 匹配,因为 4 <= 8 。 - players[1] 与 trainers[3] 匹配,因为 7 <= 8 。 可以证明 2 是可以形成的最大匹配数。
【样例2输入】
3 1 1 1 1 10
【样例2输出】
1
【样例2解释】
训练师可以匹配所有 3 个运动员 每个运动员至多只能匹配一个训练师,所以最大答案是 1 。
【数据范围】
1 <= players.length, trainers.length <= 105
1 <= players[i], trainers[j] <= 109
【题目描述】
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i
,都有一个胃口值 g[i]
,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j
,都有一个尺寸 s[j]
。如果 s[j] >= g[i]
,我们可以将这个饼干 j
分配给孩子 i
,这个孩子会得到满足。你的目标是满足尽可能多的孩子,并输出这个最大数值。
【输入描述】
3行,第一行n和m表示有n个孩子的胃口,m表示有块饼干。
第二行是这n个孩子的胃口,每个数中间用空格隔开
第三行是m块饼干的尺寸。
【输出描述】
满足尽可能多的最大数值
【样例1输入】
3 2 1 2 3 1 1
【样例1输出】
1
【样例1解释】
你有三个孩子和两块小饼干,3 个孩子的胃口值分别是:1,2,3。 虽然你有两块小饼干,由于他们的尺寸都是 1,你只能让胃口值是 1 的孩子满足。 所以你应该输出 1。
【样例2输入】
2 3 1 2 1 2 3
【样例2输出】
2
【样例2解释】
你有两个孩子和三块小饼干,2 个孩子的胃口值分别是 1,2。 你拥有的饼干数量和尺寸都足以让所有孩子满足。 所以你应该输出 2。
【数据范围】
1 <= g.length <= 3 * 104
0 <= s.length <= 3 * 104
1 <= g[i], s[j] <= 231 - 1