1.脏矩形合并
题目:
在2D渲染系统中,局部渲染是常见提升渲染性能的方法。如果界面中有元素发生了改变,我们可以将这个元素所占矩形区域标记为脏矩形,那么在接下来的渲染中,我们仅对每个脏矩形所占矩形区域执行一次局部渲染即可,无需渲染全屏。 但系统提供的局部渲染API有如下限制: 1. 单次局部渲染区域必需是矩形,不能是多边形,圆形或者其他不规则形状。 2. 单次局部渲染时间开销除了和渲染像素数量呈线性正相关之外,还有一些固定的额外开销。 3. 单个元素不可切分渲染,既最初标记的脏矩形不可切分渲染。 因此为了总渲染时间开销最优,我们一般不直接对每个标记的脏矩形都执行一次局部渲染,而是先对重叠或者相近的脏矩形进行合并,从而减少局部渲染次数。 经过测试,在某台设备上,单次局部渲染时间开销与渲染像素数量(既渲染面积)的关系为f(x)=10000+x。 现在要求你设计一个算法,算法输入一组脏矩形列表,输出经过合并后的脏矩形列表的总渲染时间开销,要求合并后的脏矩形列表总渲染时间开销在这台设备上最优。 输入: 输入数据包含多行 第1行,整数N(脏矩形数量,1<=N<=8) 第2行,整数L1(第一个脏矩形左上角横坐标) 第3行,整数T1(第一个脏矩形左上角纵坐标) 第4行,整数W1(第一个脏矩形宽, 1<=W1) 第5行,整数H1(第一个脏矩形高, 1<=H1) ... 第4*(N-1)+2行,整数LN(第N个脏矩形左上角横坐标) 第4*(N-1)+3行,整数TN(第N个脏矩形左上角纵坐标) 第4*(N-1)+4行,整数WN(第N个脏矩形宽, 1<=WN) 第4*(N-1)+5行,整数HN(第N个脏矩形高, 1<=HN) 输出: 输出合并后的脏矩形列表总渲染时间开销 输入范例: 5 232 66 111 41 197 44 29 53 154 208 42 12 177 87 9 102 75 168 79 41 输出范例: 45291
这是我前两天参加阿里春招笔试的第一道编程题,可能读起来确实有些让人费解,大体的意思就是给你若干个矩形的坐标,你要渲染这些矩形,每执行一次渲染会消耗(10000+矩形面积)的时间,你可以渲染一大块矩形把其中多个矩形一起渲染,你要尽可能使时间最小。如果你还看不懂就看下面这个图:
黑色的矩形代表脏矩形 红色的矩形代表渲染的矩形 因为左边矩形的重合较多 所以可以一起渲染使得花费时间更少 右边的矩形因为离左边过远所以不适合一起渲染
这个问题需要考虑两种情况:
- 两个矩形相交 考虑合并 合并花费大于非合并--》不合并 否则合并
- 两个矩形距离较近 考虑合并 合并花费大于非合并--》不合并 否则合并
那么整个解题的流程就出来了
处理输入--》矩形数组
遍历矩形{
如果相交且合并消耗小于等于非合并{
合并矩形
}
}
遍历矩形{
如何两者合并消耗小于非合并{
合并矩