题解
【入门】等比例缩放照片
1 条题解
-
0
解题思路
给定图片原始宽高 x、y,以及 n 组压缩尺寸,找出宽高比最接近原始的那组。如果多组一样接近,输出面积最小的。
思路:逐个比较宽高比。
- 原始宽高比 = x ÷ y
- 对每组压缩尺寸 (w, h),算它的宽高比 = w ÷ h
- 求差距 = 绝对值(当前比 - 原始比)
- 选差距最小的那组
- 如果差距一样,选面积(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