[itint5]摆放窗口
http://www.itint5.com/oj/#47
一种做法是:把矩形所占的方格都设为-1,就是个最大子矩阵和问题。复杂度o(w^2*h)或o(w*h^2),空间W*H
猜想应用场景是:电脑屏幕上已经有了n个聊天框,新建一个聊天框,放在屏幕的哪个位置最好。客户端计算的话,空间复杂度太高的算法应该是没法实际应用的。这种方法OJ也会空间超出。
另一种做法(贪心思想,和一个矩形覆盖最小):
所求矩形的上边要么贴着边界,要么贴着某个已有矩形的下边
所求矩形的下边要么贴着边界,要么贴着某个已有矩形的上边
所求矩形的左边要么贴着边界,要么贴着某个已有矩形的右边
所求矩形的右边要么贴着边界,要么贴着某个已有矩形的左边
总可以找到一个满足最小覆盖条件的矩形,这个矩形的边要么与大窗口的边缘重合,要么和已知矩形的边重合。可以使用常见的贪心思想证明,假设有任意一个满足最小覆盖条件的矩形,总可以将其移动到与已有的边重合。
这样,只需要枚举O(n^2)的左上点坐标,总的时间复杂度O(n^3)。
可以这样理解,假设已经把矩形放在一个位置了,先只考虑上下移动(左右同理),那么在上下边遇到另一条横边之前,往上移动覆盖面积要么单调递增要么单调递减(也可以覆盖不变),往下移动单调性相反。那么总能移动到和某一条边重合并比原来覆盖面积相等或更小的。所以假设已经找到一个满足最小覆盖条件的矩形,那么可以将其移动到与已有的边重合。
注意:求两个矩形相交部分的面积的写法也很值得参考。
int calOverlapping(Rect &a, Rect &b) {
int x = max(0, min(a.x2, b.x2) - max(a.x1, b.x1));
int y = max(0, min(a.y2, b.y2) - max(a.y1, b.y1));
return x * y;
} int minOverlapping(vector<Rect> &rects, int W, int H, int w, int h) {
if (rects.size() == 0) return 0;
vector<int> x, y;
x.push_back(0); x.push_back(H-h);
y.push_back(0); y.push_back(W-w); for (int i = 0; i < rects.size(); i++) {
if (rects[i].x1 - h >= 0) x.push_back(rects[i].x1 - h);
if (rects[i].y1 - w >= 0) y.push_back(rects[i].y1 - w);
if (rects[i].x2 + h <= H) x.push_back(rects[i].x2);
if (rects[i].y2 + w <= W) y.push_back(rects[i].y2);
} int ans = w * h; // max is fully overlapped
for (int i = 0; i < x.size(); i++) {
for (int j = 0; j < y.size(); j++) {
Rect r;
r.x1 = x[i]; r.x2 = x[i] + h;
r.y1 = y[j]; r.y2 = y[j] + w;
int cal = 0;
for (int k = 0; k < rects.size(); k++) {
cal += calOverlapping(rects[k], r);
}
if (cal < ans) ans = cal;
}
}
return ans;
}
[itint5]摆放窗口的更多相关文章
- HyperDock,让Mac的窗口飞
三年前写了一篇文章,介绍了Windows 7下的Aero效果,其实最终是想引出来写Mac OS上能产生类似功能的HyperDock应用程序,可惜这一拖,就拖到连Windows 10都快要发布了.没有关 ...
- 认识WinDbg
WinDbg学习笔记(一)--认识WinDbg 一.前言 本人学习WinDbg已经有好几天了,虽说技术掌握的还不太熟练,不过也总算是入门了在学习WinDbg的过程中,觉得WinDbg真的比Oll ...
- c++学习书籍推荐《C++ GUI Qt 4编程(第2版)》下载
下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 <C++ GUI Qt 4编程(第2版)>讲授的大量Qt4编程原理和实践,都可以轻易将其应用于Qt4.4.Qt4.5及后续版本的Q ...
- 【转载】Pyqt QSplitter分割窗口
转载来自: http://blog.sina.com.cn/s/blog_4b5039210100h3ih.html 分割窗口在应用程序中经常用到,它可以灵活分布窗口布局,经常用于类似文件资源管理器的 ...
- MFC主窗口架构模型
根据主窗口类型,MFC软件工程可以分为一下几种架构模型: 1.SDI(Simple Document Interface)单文档界面,一个主窗口下只编辑一份文档 2.MDI(Multiple Docu ...
- 探索Win32系统之窗口类(转载)
Window Classes in Win32 摘要 本文主要介绍win32系统里窗口类的运做和使用机制,探索一些细节问题,使win32窗口类的信息更加明朗化. 在本文中,"类", ...
- 窗口变化相关消息 OnSize、OnSizing和OnGetMinMaxInfo
最近用到窗口变化的一些东西,遇到几个相关的消息函数,简要分析,作为备忘. 3个消息分别是:WM_SIZE.WM_SIZING.WM_GETMINMAXINFO:分别对应相应的处理函数:OnSize.O ...
- Python tkinter调整元件在窗口中的位置与几何布局管理
Tkinter中的GUI总是有一个root窗口,不管你是主动或者别动获得.主窗口就是你的程序开始运行的时候创建的,在主窗口中你通常是放置了你主要的部件.另外,Tkinter脚本可以依据需要创建很多独立 ...
- C++ : 窗口变化相关消息 OnSize、OnSizing和OnGetMinMaxInfo,onsizeonsizing
个消息分别是:WM_SIZE.WM_SIZING.WM_GETMINMAXINFO:分别对应相应的处理函数:OnSize.OnSizing.OnGetMinMaxInfo. 当窗口大小发生变化时,响应 ...
随机推荐
- System.Windows.Forms.Timer
一.主要属性.方法和事件 Windows 窗体 Timer 是定期引发事件的组件.该组件是为 Windows 窗体环境设计的. 时间间隔的长度由 Interval 属性定义,其值以毫秒为单位.若启用了 ...
- css3学习笔记之2D转换
translate() 方法 translate()方法,根据左(X轴)和顶部(Y轴)位置给定的参数,从当前元素位置移动. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
- Java实战之04JavaWeb-03会话技术
一.会话技术简介 1.什么是会话,为什么需要会话技术? 会话:从打开一个浏览器,访问某个网站,到关闭这个浏览器的这个过程称为一次会话.http协议是状态的. 2.会话技术的分类 客户端存储技术:Coo ...
- Oracle创建新用户
1.以DBA身份登录 $ sqlplus sys/eastcom@ORCL as sysdba(在命令窗口下) 也可以使用PL/SQL 2.创建临时表空间 create temporary table ...
- [GeekBand] 面向对象的设计模式(C++)(2)
本篇笔记紧接上篇,继续学习设计模式. 4. 对象创建类设计模式 通过对象创建模式绕开new,来避免对象创建(new)过程中所导致的紧耦合,从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 4.1 ...
- 3月3日[Go_deep]Populating Next Right Pointers in Each Node
原题:Populating Next Right Pointers in Each Node 简单的链表二叉树增加Next节点信息,没什么坑.不过还是WA了两次,还是有点菜,继续做,另外leetcod ...
- [java学习笔记]java语言核心----面向对象之static关键字
static关键字用处 用于修饰成员变量和成员函数 被修饰后的成员具有以下特点: 随着类的加载而加载 优先于对象存在 被所有对象所共享 可以直接被类名调用 使用注意 静态方法只能访问静态成员:非静态方 ...
- Mac OS X安装OpenCV 3.1.0
在我的上一篇文章“”中已经介绍了Linux下OpenCV的安装配置方法,在这里仅仅记录Mac上相对于Linux的一点点差异. 1. 安装依赖包 Mac上安装软件包使用的工具是brew,用此来替代Ubu ...
- wap手机端解决返回上一页,js
<input id="hd_referrer" type="hidden" /> <a href="j ...
- 防止非授权用户调用DLL
1.首先要创建一个密钥文件(*.snk)