问题描述
Reca 公司生产高端显示器,其中最受欢迎的型号是 AB999。屏幕尺寸为 x \\times y 的比例。由于某些生产特性,屏幕参数总是整数。最终,屏幕边长比例 x:y 需要适应用户的需求。
为了满足用户需求,公司需要调整屏幕尺寸,使其满足以下条件:
- 屏幕能够完整容纳在用户给定的宽高限制 a \\times b 内;
- 调整后屏幕的宽高比必须等于 x:y;
- 调整后的屏幕尺寸尽可能接近用户提供的最大边界 a \\times b。
如果无法满足以上条件,则输出 0 0
。
输入格式
输入包含一行,四个整数 a, b, x, y,分别表示:
- 用户提供的屏幕宽高限制:a 和 b;
- 屏幕宽高比:x:y。
限制条件:
- 1 \\leq a, b, x, y \\leq 2 \\times 10\^9
输出格式
如果存在满足条件的调整尺寸,输出两个整数,分别表示屏幕的宽和高。如果无法满足条件,则输出 0 0
。
示例
示例 1
输入:
800 600 4 3
输出:
800 600
解释:
- 屏幕比例为 4:3,可以直接容纳在 800 \\times 600 内,输出原始尺寸。
示例 2
输入:
1920 1200 16 9
输出:
1920 1080
解释:
- 按照比例 16:9,调整后的屏幕最大尺寸为 1920 \\times 1080,符合限制条件。
示例 3
输入:
1 1 1 2
输出:
0 0
解释:
- 不可能调整出宽高比为 1:2 且小于等于 1 \\times 1 的屏幕。
Python代码实现
以下是问题的 Python 实现代码:
def gcd(x, y):
"""计算两个数的最大公约数"""
return y if x == 0 else gcd(y % x, x)
def main():
# 读取输入
a, b, x, y = map(int, input().split())
# 计算 x 和 y 的最大公约数,约分比例
g = gcd(x, y)
x //= g
y //= g
# 计算缩放比例
u = a // x
v = b // y
factor = min(u, v)
# 判断是否可行
if factor > 0:
print(factor * x, factor * y)
else:
print(0, 0)
if __name__ == "__main__":
main()
代码详解
-
最大公约数函数 (
gcd
):- 使用递归方式计算两个数的最大公约数,确保比例 x:y 化简为最简分数。
-
输入处理:
- 使用
map(int, input().split())
读取用户提供的宽高限制 a, b 以及比例 x, y。
- 使用
-
比例化简:
- 将 x 和 y 分别除以它们的最大公约数 g,得到最简分数形式。
-
计算缩放比例:
- 计算分别可容纳的倍数:
- u = a // x 表示 a 中可以容纳的宽度倍数;
- v = b // y 表示 b 中可以容纳的高度倍数。
- 选择最小的倍数作为最终缩放因子
factor = min(u, v)
。
- 计算分别可容纳的倍数:
-
结果判断与输出:
- 如果
factor > 0
,输出调整后的屏幕尺寸; - 否则,输出
0 0
。
- 如果
示例测试
示例 1
输入:
800 600 4 3
输出:
800 600
解释:
- 屏幕比例为 4:3,可以直接容纳在 800 \\times 600 内,输出原始尺寸。
示例 2
输入:
1920 1200 16 9
输出:
1920 1080
解释:
- 按照比例 16:9,调整后的屏幕最大尺寸为 1920 \\times 1080,符合限制条件。
示例 3
输入:
1 1 1 2
输出:
0 0
解释:
- 不可能调整出宽高比为 1:2 且小于等于 1 \\times 1 的屏幕。
实际应用场景
-
分辨率优化:
- 在显示设备中,需要根据用户提供的边界限制计算最优的显示分辨率。
- 应用场景如投影仪、屏幕调整等。
-
视频裁剪:
- 在视频剪辑中,需要调整视频画面的宽高比以适配不同的显示器。
-
工业设计:
- 用于计算工业设备中,如何最大化利用有限空间展示屏幕内容。
总结
这道题目考察了数学中的比例与最大公约数的基本应用,同时结合实际应用场景(显示器分辨率调整),非常贴近实际问题。通过简洁的代码实现,可以在 O(\\log(\\min(x, y))) 的时间复杂度内解决问题。
希望这篇文章能对你有所帮助!如果喜欢,记得点赞支持哦 😊~