题解:监控屏幕调整问题

问题描述

Reca 公司生产高端显示器,其中最受欢迎的型号是 AB999。屏幕尺寸为 x \\times y 的比例。由于某些生产特性,屏幕参数总是整数。最终,屏幕边长比例 x:y 需要适应用户的需求。

为了满足用户需求,公司需要调整屏幕尺寸,使其满足以下条件:

  1. 屏幕能够完整容纳在用户给定的宽高限制 a \\times b 内;
  2. 调整后屏幕的宽高比必须等于 x:y;
  3. 调整后的屏幕尺寸尽可能接近用户提供的最大边界 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()

代码详解

  1. 最大公约数函数 (gcd):

    • 使用递归方式计算两个数的最大公约数,确保比例 x:y 化简为最简分数。
  2. 输入处理:

    • 使用 map(int, input().split()) 读取用户提供的宽高限制 a, b 以及比例 x, y。
  3. 比例化简:

    • 将 x 和 y 分别除以它们的最大公约数 g,得到最简分数形式。
  4. 计算缩放比例:

    • 计算分别可容纳的倍数:
      • u = a // x 表示 a 中可以容纳的宽度倍数;
      • v = b // y 表示 b 中可以容纳的高度倍数。
    • 选择最小的倍数作为最终缩放因子 factor = min(u, v)。
  5. 结果判断与输出:

    • 如果 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 的屏幕。

实际应用场景

  1. 分辨率优化:

    • 在显示设备中,需要根据用户提供的边界限制计算最优的显示分辨率。
    • 应用场景如投影仪、屏幕调整等。
  2. 视频裁剪:

    • 在视频剪辑中,需要调整视频画面的宽高比以适配不同的显示器。
  3. 工业设计:

    • 用于计算工业设备中,如何最大化利用有限空间展示屏幕内容。

总结

这道题目考察了数学中的比例与最大公约数的基本应用,同时结合实际应用场景(显示器分辨率调整),非常贴近实际问题。通过简洁的代码实现,可以在 O(\\log(\\min(x, y))) 的时间复杂度内解决问题。

希望这篇文章能对你有所帮助!如果喜欢,记得点赞支持哦 😊~


相关推荐
粥里有勺糖11 分钟前
安利一下最近用的桌面“Agent” | T3 Code
前端·github·ai编程
明如正午13 分钟前
用 Python 一键把 ASC 文件转成 BLF(基于 python-can)
python·can·blf·asc
xy345317 分钟前
Axure 9.0 动态面板基本操作
前端·ui·html·axure·原型·产品设计
jidaowansui20 分钟前
B3643 图的存储———>数组模拟邻接矩阵
算法
不停喝水26 分钟前
【前端转全栈java速通课】 项目实战④7-11节 操作数据库-登录-注册-修改密码-注销-mubatis-plus简化crud-
java·前端·数据库
y1su31 分钟前
Leetcode 二分模板
java·数据结构·算法·leetcode·排序算法
youshi666838 分钟前
平衡车——PID算法优化
stm32·单片机·嵌入式硬件·算法·pid·平衡车
leisoo80971 小时前
融资融券数据怎么查两融指标含义与杠杆观察方法 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·json
Patrick在香港1 小时前
同一份脚本,mac 正常 Windows 乱码:open() 默认编码实测(附 3.15 终局)
utf-8·windows·python·macos·跨平台·编码·标准库
一水鉴天1 小时前
统一对象拓扑(UOT)设计全链定稿:从三件事分离到三继承 之1 20261010(豆包“查看聊天内容”继续)
前端·css