【题解】骨牌铺方格
【题目描述】
有1×n(n<=50)的一个长方形,用一个1×1、1×2和1×3的骨牌铺满方格,请问有多少种铺法?
例如当n=3时为1×3的方格。此时用1×1、1×2和1×3的骨牌铺满方格,共有四种铺法。如下图:
【输入描述】
一个整数n(n<=50)
【输出描述】
骨牌的铺法
【样例输入】
3
【样例输出】
4
【题目描述】
有1×n(n<=50)的一个长方形,用一个1×1、1×2和1×3的骨牌铺满方格,请问有多少种铺法?
例如当n=3时为1×3的方格。此时用1×1、1×2和1×3的骨牌铺满方格,共有四种铺法。如下图:
【输入描述】
一个整数n(n<=50)
【输出描述】
骨牌的铺法
【样例输入】
3
【样例输出】
4
【题目描述】
几个人过河,每次过两人一人回,速度由慢者决定,问过河所需最短时间。
【输入描述】
输入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