1 条题解

  • 0
    @ 2025-5-14 23:42:57

    题意理解

    题目要求实现一个流式布局管理器,将一系列矩形按从左到右的顺序排列在一个矩形窗口中。如果当前行无法容纳下一个矩形,则将其放置到下一行的最左侧。最终需要计算并输出窗口的宽度和高度。

    解决思路

    1. 输入处理:读取最大窗口宽度 maxwidth,然后读取一系列矩形的尺寸,直到遇到 -1 -1 为止。
    2. 初始化变量
      • ans_width:最终窗口的宽度。
      • ans_height:最终窗口的高度。
      • curwidth:当前行的宽度。
      • maxheight:当前行的最大高度。
    3. 处理每个矩形
      • 如果当前行的宽度加上新矩形的宽度不超过 maxwidth,则将矩形添加到当前行,并更新当前行的宽度和高度。
      • 否则,将当前行的宽度和高度累加到总宽度和总高度中,并开始新的一行。
    4. 处理最后一行:在循环结束后,将最后一行的宽度和高度累加到总宽度和总高度中。
    5. 输出结果:打印最终窗口的宽度和高度。

    代码实现

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    const int MAXN = 2000;
    
    struct window {
        int width;
        int height;
    } a[MAXN];
    
    int main() {
        int maxwidth;
        while (~scanf("%d", &maxwidth), maxwidth) {
            int len = 0;
            while (scanf("%d%d", &a[len].width, &a[len].height)) {
                if (a[len].width == -1 && a[len].height == -1)
                    break;
                len++;
            }
    
            int ans_height = 0;
            int maxheight = 0;
            int curwidth = 0;
            int ans_width = 0;
            for (int i = 0; i < len; i++) {
                if (curwidth + a[i].width > maxwidth) { // 放到下一行
                    ans_width = max(ans_width, curwidth); // 更新最大的宽度
                    ans_height += maxheight;             // 更新高度
                    curwidth = a[i].width;               // 当前的宽度就是这块的宽
                    maxheight = a[i].height;             // 当前这一行最大高就是这块的高
                } else { // 放到这一行
                    curwidth += a[i].width;              // 更新总宽度
                    maxheight = max(a[i].height, maxheight); // 更新最大的高度
                    ans_width = max(ans_width, curwidth); // 更新宽度
                }
            }
            printf("%d x %d\n", ans_width, ans_height + maxheight);
        }
        return 0;
    }
    

    代码解释

    1. 输入处理

      • 使用 scanf 读取最大窗口宽度 maxwidth,直到遇到 0 结束。
      • 读取矩形的尺寸,直到遇到 -1 -1 为止。
    2. 初始化变量

      • ans_widthans_height 用于存储最终窗口的宽度和高度。
      • curwidthmaxheight 用于跟踪当前行的宽度和高度。
    3. 处理每个矩形

      • 如果当前行无法容纳新矩形,则更新最终窗口的宽度和高度,并开始新的一行。
      • 否则,更新当前行的宽度和高度。
    4. 输出结果

      • 在循环结束后,将最后一行的宽度和高度累加到总宽度和总高度中,并打印结果。

    总结

    通过模拟流式布局管理器的行为,可以高效地计算出最终窗口的尺寸。代码中使用了结构体和循环来处理输入和布局逻辑,确保了程序的正确性和高效性。

    • 1

    信息

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