02 2013 档案
uva 11627 Slalom (二分法)
摘要:uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2674 一道比较明显的二分题,主要是在二分的判断上耗费了一点时间。代码如下:View Code 1 typedef pair<int, int> PII; 2 typedef vector<int> VI; 3 typedef vector<PII> VPII; 4 5 #define REP(i, n) for (int i = 0; i < (n);
阅读全文
uva 10317 Equating Equations (搜索题)
摘要:uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1258 又是一道搜索,不过我用了状态压缩来做,开始的时候有两个剪枝加进去,从而3s的时限都超过了。一个是数的和的奇偶性判断,另外一个剪的不明显,那就是统计的时候正或负的和一旦超过整体和的一半时,不用继续加下去。 这道题麻烦之处主要是它的模拟,输入输出的模拟因为没想到怎么可以更简便,于是就十分暴力的处理了,庆幸这么乱都没有打错。记录一下代码:View Code 1 typedef vector&l
阅读全文
uva 10318 Security Panel (dfs+剪枝)
摘要:uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1259 压缩Panel的全部状态,预处理出每个位置的变化,然后dfs搜索全部情况。不过这样是会超时的,所以我在搜索的过程中加上剪枝,预判出之前的状态是否能够使得最后整个Panel充满,如果不能就尽早跳出搜索。加上小小的一个剪枝,速度提升估计了不下1000倍,由原来的超时,最后只要0.008s就完成了!代码如下:View Code 1 #define REP(i, n) for (int i =
阅读全文
uva 10012 How Big Is It? (greedy + enumerate)
摘要:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=953 这道题是比较简单的枚举加上贪心的题目,题意是将n个圆放进矩形内,要求圆要贴着矩形的底部,问矩形的长最小是多少。 题目需要注意的是有可能有两个半径非常大的圆夹着两个半径非常小的圆的情况,除此之外,代码都很简单。代码如下:View Code 1 #define REP(i, n) for (int i = 0; i < (n); i++) 2 #define REP_1(i
阅读全文
uva 10020 Minimal coverage (greedy)
摘要:uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=961 Classical greedy problem!The Code:View Code 1 typedef pair<int, int> PII; 2 typedef vector<PII> VPII; 3 #define REP(i, n) for (int i = 0; i < (n); i++) 4 5 VPII rec, out; 6 7 void i
阅读全文
LA 5844 Leet (dfs 搜索)
摘要:ACM-ICPC Live Archive 题意是判断两个字符串是否相同,相同的意思是将第一个串相应的字符用对应的字符串代替,如果能得到第二个串,那么就是相同。 因为代替的字符串最长只有3,所以可以简单的用搜索解决。代码如下:View Code 1 #define REP(i, n) for (int i = 0; i < (n); i++) 2 3 char sub[30][5]; 4 char buf[20], leet[100]; 5 int mx; 6 7 bool dfs(char *x, char *y) { 8 if (!*x && !*y) return
阅读全文
LA 5842 Equipment (状态压缩+dp)
摘要:ACM-ICPC Live Archive 根据题意,因为最多只有五种属性,所以可以通过其中几种属性是否确定了来进行DP。 有这个想法是因为整体的最大值是由某个物品的其中某些属性来确定的,dp的时候可以独立的求出那些确定了的属性的值,通过不断更新,最后找到整体的最大值。 复杂度是O(k*3^k*n),当k大于5的时候,跟等于5的时候是一样的,所以k=min(k, 5)。代码如下:View Code 1 #define REP(i, n) for (int i = 0; i < (n); i++) 2 #define REP_1(i, n) for (int i = 1; i <=
阅读全文
LA 4254 Processor (二分+贪心)
摘要:ACM-ICPC Live Archive 这道题搞了我两天,最终还是搞出来了! 很容易就可以发现这题是二分,不过二分后怎么贪心就稍微有点难想了。贪心的方法其实很简单,就是尽量先把结束的早的任务先尽早的完成了。如果在给定的处理器速度下不能完成所有任务,那么这个速度就还不够。 我的方法是用线段树填充尽量靠左的填充没利用的速度,根据能够填充的量,判断贪心是否能够做到。代码如下:View Code 1 #define REP(i, n) for (int i = 0; i < (n); i++) 2 3 #define lson l, m, rt << 1 4 #define rs
阅读全文
LA 4794 Sharing Chocolate (搜索)
摘要:ACM-ICPC Live Archive 搞了一个晚上。。一道搜索可行解的题,开始的时候理解错了,以为可以dp直接搞掂。不过仔细想了一下,发现就算是理解错题意,dp起来也是很麻烦的。。。- - 最后瞄了一下题解,调了一晚,搞掂括号放错位置的问题以后就过了。。囧。AC code:View Code 1 #define REP(i, n) for (int i = 0; i < (n); i++) 2 3 int sum[N], sz[20]; 4 bool vis[N][M]; 5 6 void input(int n) { 7 REP(i, n) cin >> sz[i];
阅读全文
ZOJ 3031 Robotruck (dp + 单调队列)
摘要:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=2029 搞了一个多小时的一道DP&&单调队列题。这题在ACM-ICPC Live Archive中有相似的一题,不过在LA中,每个位置的物品重量不为0,这样就限制了寻找上一层dp值的范围只在下标为i-100~i 之间,复杂度是O(CN)。可是到了ZOJ,dp值的寻找就有可能要把之前所有已经处理的状态都找一遍,这样子,同样的做法就果断超时了。 不过可以轻易的发现,dp是线性的,而且最优值是可以通过某种转换方式表示出来。同时,因为物品的发放顺序有所限制,所以可以直
阅读全文
uva 10859 Placing Lampposts / Tree DP
摘要:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=20&page=show_problem&problem=1800 树DP,要求求出最小覆盖点集,并且要求两端都有覆盖的边尽可能多。于是,这题可以通过赋权,求树的最小权值。无向无环图通过dfs变成有根树一棵,然后对每个树根DP,最后得到答案。代码如下:View Code 1 #define REP(i, n) for (int i = 0; i < (n); i++) 2 3 int dp[2][N];
阅读全文
uva 10891 Game of Sum (DP水题)
摘要:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1832 博弈类的DP,通过枚举较短一段的最大得分推出较长一段的最大得分。转移方程是 dp[i][j] = sum[i][j] - min(dp[i][i], dp[i][i + 1], ... , dp[i][j - 1], dp[i + 1][j], dp[i + 2][j], ... ,dp[j][j])。O(n^3)算法:View Code 1 #define REP(i,
阅读全文
poj 2741 Colored Cubes(dfs暴力枚举)
摘要:2741 -- Colored Cubes 十分好的一个暴力枚举题,题意是,给出最多4个筛子,每个面都有一个颜色标记,要求求出最少改变多少个面,使得这些筛子可以通过某些旋转使其完全相同。 刚接到这题的时候,有点老鼠拉龟的感觉,首先想到的居然是dp。。。然后细心一想,这个题最多才4个筛子,何不直接暴力枚举呢?枚举复杂度最多才到O(24^n),因为筛子一共有24种放置的方法。然后一个问题就来了,这24种状态要怎么搞出来?一个不小心错了一个数字就很难debug 的了。于是,我在草稿纸上写了前面是1的4种情况,然后发现其余的,前面是2~6的各自的4种情况都是一样的转换方式,所以之后的直接利用转换即..
阅读全文
浙公网安备 33010602011771号