摘要: 原题传送:http://codeforces.com/problemset/problem/2/B 动态规划。 要求经过的路径上的数的乘积的最少末尾0的个数,容易想到把“10”分解成“2”和“5”,那么答案就是“2”和“5”中计数少的那个。如果只用一次DP过程同时求解当前“2”或“5”的次数会发现前面出现的“2”或“5”的次数完全无法确定当前位置的值(这种类似贪心的算法是错误的)。那么可以想到将“2”和“5”两个数字分开,分别进行一次DP,题目要求的只是终点的值的末尾0的个数,那么答案就是终点值“2”和“5”中计数少的对应出现的次数。 对于矩阵中出现0的情况要特殊处理,看是否有一条路... 阅读全文
posted @ 2012-11-26 14:57 芒果布丁 阅读(527) 评论(0) 推荐(0) 编辑
摘要: 原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=1151 DAG图的最小路径覆盖数 = 节点数(n)- 最大匹配数(m) 所以,关键是求二分图的最大匹配数,上匈牙利就行了。View Code 1 #include <iostream> 2 #include <string.h> 3 #include <cstdio> 4 using namespace std; 5 6 const int M=120 + 2; 7 bool g[M][M],visit[M]; 8 int link[M],m,n,k; 9 10 阅读全文
posted @ 2012-11-24 13:23 芒果布丁 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=4463 这题算是比较裸的最小生成树。由于耐克店和苹果店要有公路相连,所以要先加上这条公路长度,然后将这条公路长度置0,那么就不会影响求最小生成树的贪心过程。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <math.h> 5 const int maxn = 50 + 2; 6 7 struct node 8 { 9 doubl 阅读全文
posted @ 2012-11-23 22:16 芒果布丁 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=4417 划分树 + 二分。 总复杂度为mlog(n)log(n),在O(10^7)左右,可以破了,二分查询区间第k大值,如果该值小于或等于给定高度,那么继续二分。那么最后得到的k值就是所求。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 const int maxn = 100000 + 10; 5 6 int tree[20][maxn], num[20] 阅读全文
posted @ 2012-11-22 19:32 芒果布丁 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=3473 做出这题感觉又帅了。 划分树。 一看题目很容易想到每次查询求的x就是该区间排序后的中位数,再看看规模,不难想出得用划分树nlog(n)。 尽管题目给了8s的时限,然而,如果每次只是求出中位数在循环一遍区间去求答案,也会TLE,所以,另开数组lsum[],在建树的时候记录放到左子树的元素的和,则可在每次询问的时候,如果在树的某一层要进入右子树,那么,该区间进入左子树的所有元素的和都是小于中位数的。 另外,如果这题写丑了会卡掉内存的,当时我写的时候是开两个数组lsum[]和rsum... 阅读全文
posted @ 2012-11-22 18:40 芒果布丁 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 原题传送:http://uva.onlinejudge.org/external/111/11137.html 递推,动态规划。 d[i][j]表示使用不超过i的 i 的整数的立方,累加和为 j 的方案数。 则有状态转移方程: d[i][j] = d[i - 1][j] + d[i][j - i3]。 初始条件d[0][0] = 1;View Code 1 #include <stdio.h> 2 #include <string.h> 3 typedef long long LL; 4 5 const int maxi = 21; 6 const int maxn = 阅读全文
posted @ 2012-11-19 23:47 芒果布丁 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=4472 动态规划, 记忆化搜索。 设此时总节点数位n,则余下的节点总数为k = n - 1,因为同一级节点的子节点数要相同,只需对k的所有因子进行子结构搜索。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 4 const int mod = 1000000007; 5 const int maxn = 1000 + 2; 6 7 int f[maxn]; 8 9 in 阅读全文
posted @ 2012-11-19 20:07 芒果布丁 阅读(261) 评论(0) 推荐(0) 编辑
摘要: 保存一下自己的gVim配置,方便以后重装: _vimrc文件设置 配置c/c++也很简单,不需要自己写makefile,下载个cvim解压到vimfiles文件夹覆盖就可以了,当然电脑要先搭建gcc/g++(如果安装了集成minGW的codeblocks,直接配置环境变量就可以了)。 一些常用到的指 阅读全文
posted @ 2012-11-15 11:56 芒果布丁 阅读(246) 评论(0) 推荐(0) 编辑
摘要: 【原题链接】 约瑟夫环,普通链表法O(nk)复杂度无法承受,但是可以有O(n)的算法。 以下摘自百度百科: 无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。我们注意到原问题仅仅是要求出最后的胜利者的序号,而不是要读者模拟整个过程。因此如果要追求效率,就要打破常规,实施一点数学策略。 为了讨论方便,先把问题稍微改变一下,并不影响原意: 问题描述:n个人(编号0~(n-1)),从0开始报数,报到m-1的退出,剩下的人继续从0开始报数。求胜... 阅读全文
posted @ 2012-11-12 15:07 芒果布丁 阅读(270) 评论(1) 推荐(0) 编辑
摘要: 【原题链接】 k太大,hash数组开不下,用了map判圈。View Code 1000+ms 1 #include <stdio.h> 2 #include <string.h> 3 #include <map> 4 using namespace std; 5 6 typedef long long LL; 7 8 LL cal(int n, LL &v, LL &ans) 9 {10 v = v * v;11 int L = 0;12 LL tmp = v;13 while(tmp)14 {15 L ++;16 ... 阅读全文
posted @ 2012-11-06 15:18 芒果布丁 阅读(318) 评论(0) 推荐(0) 编辑
摘要: 1 //适用于正整数2 template <class T>3 inline void scan_d(T &ret) {4 char c; ret=0;5 while((c=getchar())<'0'||c>'9');6 while(c>='0'&&c<='9') ret=ret*10+(c-'0'),c=getchar();7 } 1 //适用于正负整数 2 template <class T> 3 inline bool scan_d(T 阅读全文
posted @ 2012-11-06 11:45 芒果布丁 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 原题传送:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2459 一般的想法是枚举每一个元素,那么会有2255种情况,显然无法承受。注意到约束条件是某元素周围上下左右四个元素之和必须为偶数,利用这个条件,我们可以轻松的在2255种情况中去掉不合法的情况而剩下合法的情况,并在这些合法的情况中选择最优的符合题目输入数据的情况。那么,只需要枚举第一行,由第一行可以推出第二行,进而第三行…第n行。直接深搜比较,复杂度O(2n*n2)。V 阅读全文
posted @ 2012-11-05 13:08 芒果布丁 阅读(315) 评论(0) 推荐(0) 编辑
摘要: 原题传送:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1822 题目没有给出T的范围,自己自作多情写了个O(nT)的程序,枚举题意后发现T的范围竟然达到了106!!!这样我就思密达了。 书上这么一个神奇的转换思路: 1. “调头”等价于“对穿而过” 2. 所有蚂蚁的相对顺序保持不变 (显然的,因为实际上是不可能穿过的)View Code 1 #include <stdio.h> 2 #include <str 阅读全文
posted @ 2012-11-04 00:06 芒果布丁 阅读(192) 评论(0) 推荐(0) 编辑
摘要: 原题传送:http://poj.org/problem?id=1696 利用叉积判断所有点与线段位置关系。下一棵植物A'的位置与蚂蚁位置A的连线得到线段AA',如果所有没有吃掉的植物均在AA'的左端,那么A'为应该吃的下一目标(如果多个植物在同一条直线上,先吃最近的一个)。因为无论坐标如何变化,在最有的状态下,蚂蚁总会把所有植物都吃掉,可以利用这个条件退出循环。View Code 1 #include <stdio.h> 2 #include <math.h> 3 #include <string.h> 4 #include 阅读全文
posted @ 2012-11-03 13:51 芒果布丁 阅读(222) 评论(0) 推荐(0) 编辑
摘要: 原题传送:http://poj.org/problem?id=3154 模型转换一下,把圆形的路从某个雕塑处剪开拉成一条直线,这样就很容易处理出添加雕塑前后的位置数组a[N]和c[N+M]。对于原状态的一个雕塑a[i],在新位置数组c[N+M]中找出小于等于a[i]的位置c[j],然后取位置j和其相邻两点j-1、j+1(如果有的话)距离的最小值(a[i] - min(c[j-1], c[j], c[j+1]))为a[i]须移动的最短距离。 原来想的时候会顾虑这样一个问题:在原来的位置数组a[N]中会不会出现相邻的两个点a[i],a[i+1]同时和c[j]距离最近,也就是说上述思想会不会... 阅读全文
posted @ 2012-11-02 11:10 芒果布丁 阅读(378) 评论(0) 推荐(0) 编辑