摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=1677 题意是,给出一些矩形的长和宽,如果l1<l2且w1<w2,那么矩形2可以套在矩形1外面。问最优的套法下,最后可以剩下多少个矩形。 我想到的一个做法是,利用Treap来对当前最外层矩形是哪些进行维护。首先我们先按照宽(第二关键字)递增排序,如果相同就按长(第一关键字)递增排序。然后在构建出一棵空的Treap,按顺序插入到树中去。对于每一次插入,找到最大的可以被当前矩形覆盖的一个矩形,然后更新成新的矩形。如果找不到这样的矩形,就直接插入当前矩形。最后Treap的大小就是所需的答案。代码如下: 阅读全文
摘要:
Problem - 1224 水题一枚。 题目的意思是给出一个DAG,找出一条回路,路径的权值的和最大,输出最大值以及其路径。 构出DAG以后,spfa求最长路。代目如下: 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <vector> 5 #include <queue> 6 7 using namespace std; 8 9 typedef vector<int> VI;10 const int N = 111; 阅读全文
摘要:
Problem - 1069 随便找到的一道题目。 题意是给出一些的长方体,长方体可以用任意次数,可以任意翻转。如果一个长方体可以叠在另一个长方体上,条件是这个长方体的长和宽严格小于另一个长方体的长和宽。问给出的n种长方体最高可以叠到多高。 因为长方体有三种不同的面,而且长方体的长和宽要严格小于前一个,所以可以将一个长方体拆成三种不同的面作为底面的长方体,而且假设长总是大于宽的。将长方体按照长和宽排序,然后假设len[i]是放置第i个长方体的时候能得到的最大高度,之后的做法基本上跟LIS的操作一样了。 代码如下: 1 #include <cstdio> 2 #include < 阅读全文