摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1444约瑟夫环问题找规律: 1 1 1...1 2 1 10...1 3 3 11...1 4 1 100...1 5 3 101...1 6 5 110...1 7 7 111...1 8 11000...1左移一位 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 ...
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1443题目的大意就是说密码是n位的,所以有10^n种情况,然后由于当输入密码长度大于n时,只有最后n为有效。这样我们只要用一个(10^n+n-1)长的数字序列,就能破解这个密码。用DFS找一个欧拉回路,按照字典序输出路径。由于状态过多,不能用递归,要用非递归实现DFS,然后用stack会超时,那就自己写个数组吧 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include...
阅读全文
摘要:http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=2239poj http://poj.org/problem?id=1805题目的大概意思就是一些人要投票去三个地方,要注意的是同一个人如果同时有两或以上个想去的地方,那他就会弃权,其他的只要按照题目给的逻辑就可以了 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #incl...
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1029poj 2411 http://poj.org/problem?id=2411这个题目类属于状态压缩DP,对于状态压缩DP,其实最简单的理解就是把状态用比特位的形式表示出来,我们会在下面用例子来说明。假如现在我们在铺砖 位置(i, j), 并且假设之前的位置已经铺设好的了,在这个位置,我们的选择:1. 不用铺砖了,可能在(i-1, j)的时刻已经被竖着铺上了,然后考虑的是(i, j+1)2. 横铺砖,将(i, j+1)也铺上了,然后考虑的是(i, j+2)3. 竖着铺砖,(将i,j)和(i+
阅读全文
摘要:http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=1271因为盒子的方向是任意定的,所以把盒子的三个方向都存下来在dp会方便很多 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 9 struct Node10 {11 int x, y, z;12 }b[100];13 int n;14 15 bool cmp(const Node &a, const Node &b)16 {17 ...
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1765题意:给出一系列物体的宽与高,满足w1 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 #include11 #include12 #include13 #include14 #include15 #include16 using namespace std;17 struct node{18 int w,h;19 }a[20005];20 bool c...
阅读全文
摘要:http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=1180poj 2121 http://poj.org/problem?id=2121题目大意:输入数字的英文写法,输出阿拉伯数字。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 using namespace std; 13 14 mapmy; ...
阅读全文
摘要:http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=1494poj 1742 http://poj.org/problem?id=1742这题是一个部分背包,本来想过用二分的方法变成一个0-1背包,时间复杂度为(nlogV*V),但是还是超时了,所以要优化成(nV)的才能过 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 10 int dp[100005], cou[100...
阅读全文
摘要:EOJ 2743 http://acm.cs.ecnu.edu.cn/problem.php?problemid=2743本题为LIS:即Longest Increasing Sequence.(本题中严格递增)最长上升子序列(LIS)长度的O(nlogn)算法:(对状态转移时查找的优化) 用len[ i ]存放当前(需不断更新) 长度为 i 的上升子序列的末尾 的最小值, 注意到,len[]严格递增,可对其进行二分查找, 找到最大的i ,且满足len[ i ] 2 #include 3 #include 4 #include 5 #include 6 #include 7 ...
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1104题意:给一张只有1和0的图,求图上所有'0'的点到'1'的点的最短距离.解法:若对每个0进行BFS到1的距离会超时,故从每个1进行BFS,更新到每个0的距离,可假象有一个源点连接着所有的1,从该源点进行BFS的搜索就可以达成一遍BFS更新所有0,方法即 先将所有1的点入队后,再进行BFS。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #includ
阅读全文
摘要:http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=1126hdu 1007 http://acm.hdu.edu.cn/showproblem.php?pid=1007 求最近点对的距离。主要思想就是分治。先把n个点按x坐标排序,然后求左边n/2个和右边n/2个的最近距离,最后合并。合并要重点说一下,比较麻烦。 首先,假设点是n个,编号为1到n。我们要分治求,则找一个中间的编号mid,先求出1到mid点的最近距离设为d1,还有mid+1到n的最近距离设为d2。这里的点需要按x坐标的顺序排好,并且假设这些点中,没有2点在同一个位置。(若有,则
阅读全文
摘要:http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=2067poj 3625 http://poj.org/problem?id=3625题目大意:有N个农场,现在给出他们的坐标,并且已经知道了有些农场他们之间是已经相连的了,现在问怎么连最小的边,能将这些农场都连接起来解题思路:变相的最小生成树,即将已经连起来的边的权值置为-1,那么根据prim算法,优先选的就是那条-1边,这样我们在选边的时候,如果是-1边我们就可以不用加进来 1 #include 2 #include 3 #include 4 #include 5 using n...
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2104题意:给出n个节点之间路径的载重量,求出从s点到t点的可行的最大载重量。解法:n的数据量10^6,只能用邻接表存储,二分枚举最大载重量,用BFS遍历图判断是否合理,直到得到最优解。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 #include11 #include12 #include13 #include14 #include15 #
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2518题意:给出一张图,求出其hilltop的个数。hilltop的定义:一片相同高度的区域,而周围的区域的高度都小于它,或处于图的边缘。周围的区域:与某片区域高度不相同的区域,且范围是向八个方向延伸。DFS搜索某个点,并记录,搜索周围八个方向,若有一个点大于它则这块区域不是HILLTOP。标记周围所有与它高度相同的点防止重复搜索。 1 #include 2 #include 3 #include 4 using namespace std; 5 int mat[105][75]; 6 bool
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2064大致题意:给出一些物品的体积与体积上限,选出一些物品,使得物品总体积大于等于体积上限且差值最小,求出这个差值n 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 #include11 #include12 #include13 #include14 #include15 #include16 using namespace std;17 int a[21],nex
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2069poj 3041题意:给出一系列的正整数坐标点,求最少需要几条直线覆盖所有点。思路:每个点可以由一条垂直的线或一条平行的线覆盖,用匈牙利算法计算出最大匹配,则是需要的直线的数目(意思为若有的点未被匹配到,那一定会被已连接它的某条线覆盖,可以想象成我找了一些横坐标不同的点,然后找每个x方向上的点的纵向是否能够匹配掉一些点,则这些可用垂直线连接)。若有点x,y 则x->y就有一条通路,每次x匹配y,若y已经被匹配,则看y的顶点是否有增广路径(即有其他的点x',y') 1 #
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1855题意:一辆车每行驶一单位的路程就消耗一单位的油,给出n个加油站以及他们的位置和可加油量,给出初始油量P和车与目的地的位置L,求需要加油的最少次数。思路:贪心,先把初始P全部耗尽看能走的路程是否超过L,否则就加一次油。将新路程加上当前途中经过的加油站能加油量的最大值,直到能行驶的路程大于等于L。因为考虑加油量有重复的情况,这里用了堆,优先队列,每次出队的是队内元素的最大值。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #in
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1068题意: 该题比一般的NIMM博弈多了每次取1-m个的限制,容易联想到巴什博奕。解题思路: 把每堆数量减少到 2 #include 3 #include 4 #include 5 #include 6 #include 7 8 using namespace std; 9 10 int main()11 {12 //freopen("testin.txt", "r", stdin);13 //freopen("testout.txt"
阅读全文
摘要:http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=2857一道典型dp,状态转移方程类似LCS。操作有三种:1修改一个字母,2删除一个字母,3插入一个字母。对于dp[i][j],能从如下状态转移而来: if(a[i] == b[j]) 不操作—— 对应状态dp[i-1][j-1]; else 操作1——a[i]改成b[j], 对应状态dp[i-1][j-1]+1; 操作2——删a[i], 对应状态dp[i-1][j]+1; 操作3——在a[i], a[i+1]间插入m,使 m = b[j], 对应状态...
阅读全文
摘要:EOJ 1047 http://acm.cs.ecnu.edu.cn/problem.php?problemid=1047POJ 2771 http://poj.org/problem?id=2771二分匹配 不说了,直接上代码 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 10 #define MAXN 505 11 struct node 12 { 13 int h; 14 char ...
阅读全文