1 条题解
-
0
题意理解
题目要求实现一个流式布局管理器,将一系列矩形按从左到右的顺序排列在一个矩形窗口中。如果当前行无法容纳下一个矩形,则将其放置到下一行的最左侧。最终需要计算并输出窗口的宽度和高度。
解决思路
- 输入处理:读取最大窗口宽度
maxwidth
,然后读取一系列矩形的尺寸,直到遇到-1 -1
为止。 - 初始化变量:
ans_width
:最终窗口的宽度。ans_height
:最终窗口的高度。curwidth
:当前行的宽度。maxheight
:当前行的最大高度。
- 处理每个矩形:
- 如果当前行的宽度加上新矩形的宽度不超过
maxwidth
,则将矩形添加到当前行,并更新当前行的宽度和高度。 - 否则,将当前行的宽度和高度累加到总宽度和总高度中,并开始新的一行。
- 如果当前行的宽度加上新矩形的宽度不超过
- 处理最后一行:在循环结束后,将最后一行的宽度和高度累加到总宽度和总高度中。
- 输出结果:打印最终窗口的宽度和高度。
代码实现
#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; }
代码解释
-
输入处理:
- 使用
scanf
读取最大窗口宽度maxwidth
,直到遇到0
结束。 - 读取矩形的尺寸,直到遇到
-1 -1
为止。
- 使用
-
初始化变量:
ans_width
和ans_height
用于存储最终窗口的宽度和高度。curwidth
和maxheight
用于跟踪当前行的宽度和高度。
-
处理每个矩形:
- 如果当前行无法容纳新矩形,则更新最终窗口的宽度和高度,并开始新的一行。
- 否则,更新当前行的宽度和高度。
-
输出结果:
- 在循环结束后,将最后一行的宽度和高度累加到总宽度和总高度中,并打印结果。
总结
通过模拟流式布局管理器的行为,可以高效地计算出最终窗口的尺寸。代码中使用了结构体和循环来处理输入和布局逻辑,确保了程序的正确性和高效性。
- 输入处理:读取最大窗口宽度
- 1
信息
- ID
- 1015
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者