1 条题解

  • 0
    @ 2025-5-19 12:49:29

    题意分析

    题目要求将一幅尺寸为 A×BA \times B 毫米的图像适配到一张尺寸为 C×DC \times D 毫米的纸张上,并尽可能保持图像的最大化。适配规则如下:

    1. 旋转允许:图像可以旋转 9090 度(即横向模式),此时尺寸变为 B×AB \times A
    2. 缩放限制:图像可以缩小,但无需缩小到原始尺寸的 1%1\% 以下。
    3. 适配目标:图像必须完全适应纸张而不超出边缘,且尽可能保持最大尺寸。

    示例解释

    以输入样例中的第一个测试用例为例:

    • 图像尺寸:560×400560 \times 400 毫米。
    • 纸张尺寸:218×280218 \times 280 毫米。
    • 旋转图像后尺寸为 400×560400 \times 560 毫米。
    • 缩小到 50%50\% 后尺寸为 200×280200 \times 280 毫米,完全适应纸张。
    • 输出为 50%50\%

    解题思路

    关键点分析

    1. 旋转处理

      • 图像可以以原始方向或旋转 9090 度后的方向进行适配。
      • 需要分别计算两种方向下的最大缩放比例。
    2. 缩放比例计算

      • 对于每种方向,计算图像尺寸与纸张尺寸的宽度和高度的比例。
      • 缩放比例取宽度比例和高比例中的较小值,以确保图像完全适应纸张。
      • 最终缩放比例取两种方向下的最大值。
    3. 百分比输出

      • 如果最大缩放比例 1\geq 1(即无需缩小),输出 100%100\%
      • 否则,输出最大缩放比例对应的整数百分比(向下取整)。

    解决步骤

    1. 输入处理

      • 读取每个测试用例的四个整数 AABBCCDD
      • 以四个 00 结束输入。
    2. 旋转与缩放计算

      • 计算原始方向下的缩放比例:
        • 宽度比例:C/AC / A
        • 高度比例:D/BD / B
        • 缩放比例:min(C/A,D/B)\min(C / A, D / B)
      • 计算旋转方向下的缩放比例:
        • 宽度比例:C/BC / B
        • 高度比例:D/AD / A
        • 缩放比例:min(C/B,D/A)\min(C / B, D / A)
      • 取两种方向下的最大缩放比例 SS
    3. 百分比输出

      • 如果 S1S \geq 1,输出 100%100\%
      • 否则,输出 S×100%\lfloor S \times 100 \rfloor\%

    算法复杂度

    • 时间复杂度:O(1)O(1),每个测试用例只需常数时间计算。
    • 空间复杂度:O(1)O(1),仅需常数空间存储中间结果。

    示例解析

    以输入样例的第一个测试用例为例:

    560 400 218 280
    
    1. 原始方向:
      • 宽度比例:218/5600.389218 / 560 \approx 0.389
      • 高度比例:280/400=0.7280 / 400 = 0.7
      • 缩放比例:min(0.389,0.7)=0.389\min(0.389, 0.7) = 0.389(即 38.9%38.9\%)。
    2. 旋转方向:
      • 宽度比例:218/400=0.545218 / 400 = 0.545
      • 高度比例:280/560=0.5280 / 560 = 0.5
      • 缩放比例:min(0.545,0.5)=0.5\min(0.545, 0.5) = 0.5(即 50%50\%)。
    3. 最大缩放比例:50%50\%,因此输出 50%50\%

    #include<iostream>
    using namespace std;
    int main()
    {
        int a,b,c,d;
        int temp;
        int e,f;
        while((cin>>a>>b>>c>>d)&&!(a==0&&b==0&&c==0&&d==0))
        {
            if(a<b)
            {
                temp=a;
                a=b;
                b=temp;
            }
            if(c<d)
            {
                temp=c;
                c=d;
                d=temp;
            }
            e=c*100/a;
            f=d*100/b;
            if(e<f)
            {
                if(e>100) e=100;
                cout<<e<<"%"<<endl;
            }
            else
            {
                if(f>100) f=100;
                cout<<f<<"%"<<endl;
            }
        }
        //system("pause");
        return 0;
    }
    
    • 1

    信息

    ID
    1707
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    6
    已通过
    1
    上传者