top1编程
← 返回题目
题解

【入门】等比例缩放照片

1 条题解

  • 0
    @ 2026-7-31 15:50:57

    解题思路

    给定图片原始宽高 x、y,以及 n 组压缩尺寸,找出宽高比最接近原始的那组。如果多组一样接近,输出面积最小的。

    思路:逐个比较宽高比。

    1. 原始宽高比 = x ÷ y
    2. 对每组压缩尺寸 (w, h),算它的宽高比 = w ÷ h
    3. 求差距 = 绝对值(当前比 - 原始比)
    4. 选差距最小的那组
    5. 如果差距一样,选面积(w×h)最小的

    为什么要用绝对值? 因为压缩后的宽高比可能比原始大也可能比原始小,不管大还是小,只要差距小就接近。

    举例:原始 10×4(比 2.5),压缩尺寸有 10×6(比 1.67)、15×9(比 1.67)等,最接近 2.5 的是 10×6。

    参考代码

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    int main() {
        int x, y, n;
        cin >> x >> y >> n;
    
        double ratio = 1.0 * x / y;  // 原始宽高比
    
        int bestW = 0, bestH = 0;
        double bestDiff = 1e18;
    
        for (int i = 0; i < n; i++) {
            int w, h;
            cin >> w >> h;
            double cur = 1.0 * w / h;
            double diff = fabs(cur - ratio);
    
            // 差距更小,或差距相同但面积更小
            if (diff < bestDiff - 1e-12 ||
                (fabs(diff - bestDiff) < 1e-12 && w * h < bestW * bestH)) {
                bestDiff = diff;
                bestW = w;
                bestH = h;
            }
        }
    
        cout << bestW << " " << bestH << endl;
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(N),逐个比较
    • 空间复杂度:O(1)
    • 1