题目链接
题目描述
小美使用 | 字符和 = 字符来建造梯子。一个梯子的基本结构是 |=|。多个梯子可以排成一行,并通过复用 | 字符连接,例如 |=|=| 是两个梯子。
给定 个
| 字符和 个
= 字符,求最多可以建造出多少个梯子。
解题思路
这是一个简单的资源分配问题。关键在于找出建造 个梯子需要多少
| 和 = 字符。
资源消耗分析
我们来观察一下梯子数量与所需材料的关系:
- 1 个梯子:
|=|。需要 2 个|和 1 个=。 - 2 个梯子:
|=|=|。需要 3 个|和 2 个=。 - 3 个梯子:
|=|=|=|。需要 4 个|和 3 个=。
通过观察,我们可以归纳出规律:
- 要建造
个梯子,需要
个
|字符。 - 要建造
个梯子,需要
个
=字符。
建立约束条件
我们手头有 个
| 和 个
=。设我们最多能造 个梯子。那么必须满足以下两个条件:
|字符的数量必须足够:=字符的数量必须足够:
从第一个条件可以推导出:。
结合第二个条件
,为了同时满足两者,
必须小于或等于这两个上限中的较小值。
因此,最大可能的梯子数量 就是:
边界情况
这个公式也优雅地处理了边界情况。
- 如果
|的数量不足以搭建一个梯子(即),那么
,
的结果将小于 1。由于梯子数必须是整数,最多能造 0 个,这是正确的。
- 如果
=的数量为 0(即),
的结果是 0,同样是正确的。
为了确保最终结果不为负数(例如当 时),我们可以取结果与 0 的最大值。
代码
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
long long n, m;
cin >> n >> m;
if (n < 2) {
cout << 0 << endl;
} else {
cout << min(n - 1, m) << endl;
}
return 0;
}
import java.util.Scanner;
import java.lang.Math;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
long m = sc.nextLong();
if (n < 2) {
System.out.println(0);
} else {
System.out.println(Math.min(n - 1, m));
}
}
}
import sys
def solve():
n, m = map(int, sys.stdin.readline().split())
if n < 2:
print(0)
else:
print(min(n - 1, m))
solve()
算法及复杂度
- 算法:数学/逻辑推导
- 时间复杂度:
。该解法只涉及几次基本的算术和比较操作,与输入大小无关。
- 空间复杂度:
。不需要额外的存储空间。

京公网安备 11010502036488号