摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2112题意:给出时间上限,并给出每道题需要完成的时间以及得到的价值,求能得到的最大价值与01背包不同的是,这题的时间最大10^9,即容量为这么多,不能直接对容量DP,但发现每道题获得的价值有上限200,且n最大为100,就可以对价值进行DP,然后得到所有价值中时间小于等于给出最大时间的最大值即 dp[i]为获得价值为i需要花费的最短时间,转移方程为dp[i]=min{dp[i],dp[i-V]+t}; 选出{max(i)|dp[i] 2 #include 3 #include 4 #include
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2891题意:给出一个函数解析式,画出其在定义域及值域为[-20,20]内的函数图像用一个数组记录每个次数前对应的系数。需要注意的是算出的函数值对数组下标的转换 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 #include11 #include12 #include13 #include14 #include15 using namespace
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2614题意:求其最小生成树,且判断最小生成树是否唯一。prim法,判断唯一的方法:进行两次prim,第一次,每次加最小边时当出现多个最小边时,总是添加结点编号较小的那个,而第二次总是添加较大那个 (即若总是无多个最小边选择,最小生成树必是唯一的),若生成树是完全相同的则唯一,方法是:两次分别记录加边的情况,若加边情况相同则其唯一,否则有多个解。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1821这题就等价于普通的汉诺塔,只是每一层移动两次,原来需要2^n - 1次,则现在需要2^(n + 1) - 2次,递推式为f(i) = 2 * f(i - 1) + 2 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 unsigned long long f[62]; 5 int main() 6 { 7 f[1] = 2; 8 for (int i = 2; i < 62; i
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1860题意:简单地说,对于一个1,2,3,4,5,4,3,2,1,2,……序列,限定某个数最多出现cnt次,求可得到序列元素个数的最大值cnt为10^8级,不能直接模拟,故找到循环节1,2,3,4,5,4,3,2有8个元素,1和5各出现一次,2,3,4各出现2次,观察序列可得到规律,即(cnt/出现次数)+a,a由该数的位置决定可推广至n种数字的序列。对于1,2,3,4,……n-1,n,n-1,…,2,1,2,……可知 循环节长度d=2n-2。循环节中,1与n各出现1次,其余各出现2次。限定某个数
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1839简单最短路径逃离迷宫问题,但要求依次输出路径坐标(任意)方法是用一个结构体二维数组记下每次满足条件坐标的前一个点,因为BFS的原因,每个点最多只可能访问一次,所以可以用这种方法,最后从终点开始用递归完成输出。注意在走不通迷宫的时候不要输出路径 1 #include<map> 2 #include<set> 3 #include<list> 4 #include<cmath> 5 #include<ctime> 6 #include&
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1820汉诺塔变形:每步都得顺时针。(下图为逆时针)。记 f[n] 为 把n个盘从 s->t 不经中间节点。如(A->B, B->C, C->A)记 g[n] 为 把n个盘从 s->t 经中间节点。如(A->C, B->A, C->B)分析见下图: 1 #include <stdio.h> 2 3 int main() 4 { 5 unsigned long long f[45], g[45]; 6 f[1] = 1, g[1] = 2;
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1822题意:双色汉诺塔,只是最终结果需保证相同大小的两块不倒置;容易想错:我最开始写成了:f[i] = 4*f[i-1] + 3;引用别人的题解:http://bbs.csdn.net/topics/270038285 1 #include <stdio.h> 2 3 int main() 4 { 5 long long f[65], //没有倒置. 6 g[65]; //只有最大的两个同尺寸盘子倒置 7 f[1] = 3, g[1] = 2; 8 for(in...
阅读全文
摘要:没什么营养的DFS,主要是为了好玩第一次尝试写文件离线打表(其实没意义)输出的总文件长度大概20几k.. 1 #include<map> 2 #include<queue> 3 #include<cmath> 4 #include<cctype> 5 #include<cstdio> 6 #include<string> 7 #include<cstdlib> 8 #include<cstring> 9 #include<iostream>10 #include<algorithm
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2902题意:给出一系列百分数(仅取两位小数位并四舍五入),意为第i题的通过率,从这些数据中得到至少有几个队伍参赛仅取两位小数,故可以通过枚举完成(1~100)假设有n个队伍参赛,则通过率只可能是0/n,1/n,..n/n; 1 #include<map> 2 #include<queue> 3 #include<cmath> 4 #include<cctype> 5 #include<cstdio> 6 #include<strin
阅读全文
摘要:EOJ 1499 http://acm.cs.ecnu.edu.cn/problem.php?problemid=1499此题是要求F数列(Fibonacci)f[n]的前n项和S[n]; 注意到f[n] = f[n-1] + f[n-2],错项相加有 f[0] + f[1] + f[2] + ... + f[n-2]~ S[n-2] (f[0] = 0) +f[1] + f[2] + f[3] + ... + f[n-1] ~ S[n-1]-----------------------------------------------------=f[2] + f[3] + f[...
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1028这题以字符串作为节点,有一个字符串映射到节点序号1……N的问题,可以用map来解决这题数据不大,所以可以直接用floyd算法 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 9 const int INF = 9999999;10 int m[102][102];11 mapmy;12 int n;13 14 void floyd()15 {16...
阅读全文
摘要:EOJ 1031 http://acm.cs.ecnu.edu.cn/problem.php?problemid=1031题意: 传球问题,按题意我们得到编号从1~2~..~ i ~..~n~1的环,那么去掉末尾的1(将环从n后剪开), 我们得到:1~2~..~ i ~..~n,多了首尾不同的限制,于是问题完全等价 HDU 2045 —— 染色问题(做过这题的话,很容易想到)。 HDU 2045 http://acm.hdu.edu.cn/showproblem.php?pid=2045 具体分析: n为传球总次数,i 一个空位, 待填入接到第 i-1 次传球的人; 又有p个人,...
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1027题意:给N种邮票,第 i 种邮票面值为c[i], 有amt[i]张, 问,用这些邮票,可以贴出多少面额不同的邮资。思路: 一看就是须装满的多重背包(参见lrj背包九讲)。只不过问的是有多少不同面值, 也即有多少种不同容量的背包能被装满。 如果改成这样问:给定一个面额,有多少种贴法,那就和 poj 1837 差不多了。 具体的: 把每个邮票看成一个容量为c[i]的物品,dp[i][j]表示第i个物品放完后容量为j的背包的状态, dp[i][j] = 0:未满,dp[i][j...
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2941如题意进行加密操作,求出加密前的数字。已知: a^b=b^a , a^b^b=a以n=2为例,则a=a^g[0][0]^g[0][1]^g[1][0]^g[1][1]设加密前的数字为x1,x2,x3,x4,已知加密后的为y1,y2,y3,y4则y1=x1^g[0][0]^g[0][1]^g[1][0]^g[1][1] ; y2=x2^g[0][0]^g[0][1]^g[1][0]^g[1][1] ;…………所以若想求出xi 只要式子两边同时异或g[0][0]^g[0][1]^g[1][0]^
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2530题意:求一个数组中是否存在三个数的和为0。n=1000,朴素的n^3会超时,故用二分搜索,即是把正负数存入不同的两个数组,在一个数组中任取两个,求和,然后在另一个数组中利用二分查找其相反数是否存在, 复杂度将降为n^2logn 级别 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 using namespace std;11 bool b_
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2529题意,求修造为通路耗费的最小精力。即求无向图的最小生成树,此题注意结点是0到n 为n+1个,判断连通条件可以判断树的边数是不是为n,此题用prim 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 using namespace std;11 const int inf=999999999;12 int mat[105][105];13 in
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2124题意,电梯第i层能上升Ki层或下降Ki层,问从a到b的最短操作次数最短路floyd,建图时即是把x到x+ki x-ki (若存在)赋值为1,开始存为inf。 1 #include 2 #include 3 #include 4 using namespace std; 5 int mat[105][105]; 6 const int inf=99999999; 7 void floyd(int n){ 8 for(int k=1;k0) mat[i][i-x]=1; ...
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2032测试数据必须用字符串处理,情况比较多,代码比较乱,仅说明思路。将两个字符串进行“正常化”,即变成正常的数据(没有符号,前置零等等)case 1: .xxxxx 即小数点前面无零 需在前加0。case 2: 前置符号+或-,记录一下符号,并去除、 #特殊情况: +. xxx 或 -. xxx 符号后面直接加小数点,需在前面加零。case 3:去除前置零: 00000xxxx 或者是00000000的情况,去除多余的零,但要小心0. XX的情况。case 4:去除后置0:即xx.xx000000
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1148题意:在n*n的矩阵中填入1-n^2,使得任意两个相邻的数字之和为质数,并且输出符合条件的最小序列(就是指小数尽量在前)。dfs,从小数开始填,从左到右,从上到下的方法进行搜索,可以使得判断条件仅考虑与上面数字的和以及左面数字的和为质数,并且以此方法第一个填完的表即是最小序列。但方法依然比较朴素,故tle,无奈打表。由于tle,仅提供思路 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio&g
阅读全文
摘要:EOJ 1199: http://acm.cs.ecnu.edu.cn/problem.php?problemid=1199poj 1256: http://poj.org/problem?id=1256题意不难理解: 给定一个字符串,让你完成:全排列+去重+排序; 最坑的是排序:poj 中有说明: hint: An upper case letter goes before the corresponding lower case letter. So the right order of letters is 'A'<'a'<'B'
阅读全文
摘要:原地址:http://wenku.baidu.com/view/42d690134431b90d6c85c7ca.html初期:一.基本算法:(1)枚举. (poj1753,poj2965)(2)贪心(poj1328,poj2109,poj2586)(3)递归和分治法.(4)递推.(5)构造法.(poj3295)(6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:(1)图的深度优先遍历和广度优先遍历.(2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra) (poj1860,poj3259,
阅读全文
摘要:poj 2160 http://poj.org/problem?id=2160eoj 1014 http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=1014题意:给定6个矩形,判断能否组成一个盒子。简单的说一下思想:假设这个Box有6个面,那么长宽高分别是a、b、c。那么就有3个面的关系如下(一共六个面,但是相对的面相等):a * ba * cb * c这里假设 a >= b >= c我的想法是先输入,再按长边排序。如Sample 得到的就是2584 13452584 1345 //与上面的对称2584 6832584 683 /
阅读全文
摘要:http://poj.org/problem?id=1836题意: 一队士兵排队,高低起伏。去掉最少的士兵,使得中间高两边低(单峰)。经典LIS,注意[1~n]的最优解并不一定在dp[n]中,故需预处理。 1 #include <iostream> 2 #include <stdio.h> 3 #include <string> 4 #include <string.h> 5 #include <stdlib.h> 6 #define EPS 1e-5 7 #define INF 0x3f3f3f 8 9 using namespac
阅读全文
摘要:http://poj.org/problem?id=1862题意描述: 有n个生物,体重为w1, w2, ... , wn;任意两个生物可合成为一个生物;其体重w'满足:w' = 2sqrt(wi * wj); 如此反复,终将得到一个生物,体重为W。适当调整合成顺序,使得W最小。思路:贪心 每次取体重最大的两个生物先合成。证明: 不妨设w1>w2>...>wn, f(a, b) = 2sqrt(a*b); 那么按照贪心策略: W = f(f(... f(f(w1, w2), w3) ...), wn); (1)Hint:(1)式正确,是因为f(w1, w2)合
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2859简单dfs。但花了比较大的精力去处理不添加符号的情况,求出所有的情况复杂度大概是8*3^8,最后用map匹配完成dfs遍历时存下添加符号的方法,到最终再计算处理会比较清晰。用hash可能更快。 1 #include<map> 2 #include<cmath> 3 #include<queue> 4 #include<cctype> 5 #include<cstdio> 6 #include<string> 7 #inc
阅读全文
摘要:链接:http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=2108题意是约瑟夫环问题的嵌套。由于这题的数据多大,导致不得不用公式法,设2^k<=n<2^(k+1),则题解为(n-2^k)+1这题由于n可以到2^63-1,所以在写函数的时候必须要用unsigned long long,不然会溢出 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include &
阅读全文
摘要:poj 2785 http://poj.org/problem?id=2785eoj 1046 http://acm.cs.ecnu.edu.cn/problem.php?problemid=1046 思路: 散列(hash) + 拉链法去冲突; 具体过程: 把num[][1-4]按列划分为num[][1-2] 和 num[][3-4]; 对 MAXN + num[i][1] + num[j][2] 散列;O(n^2 * len) 对 MAXN - num[i][3] - num[j][4] 查找;O(n^2 * len) 须使得被散列值为正,故用一大数 MAXN 保护;len为链表平均...
阅读全文
摘要:原地址 http://blog.csdn.net/linleiqin/article/details/5637647-----------------------------最优化问题------------------------------------- ----------------------常规动态规划 SOJ1162 I-Keyboard SOJ2096 Maximum Submatrix SOJ2111 littleken bg SOJ2142 Cow Exhibition SOJ2505 The County Fair SOJ2818 QQ音速 SOJ2469 Explori
阅读全文
摘要:链接:http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=2014题目的大意是指有多少个k位数组满足和的各位数之和等于各位数之和的和本质上就是在求有多少个k位数组满足求和时不进位,首位不可以有0,所以第一位有36种可能,之后后都有55种可能,所以k位数共36*55^(k-1)组,这个用乘法定理就可以证明,而且这题的数据很大,所以只能用高精度的算法实现 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <c
阅读全文
摘要:链接:http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=2927 这道题用了均分纸牌的方法 开始容易想到在所有的仓库中找到最多的库存量,然后向小的仓库移动,一直到所有的货物都相等,但关键是不知道往哪个方向上移动才能达到移动次数最少。设a[i]为第i个仓库的库存量(0<=i<=n),ave为均分后每个仓库的库存量,ans为最小移到次数。我们按照由左而右的顺序移动货物。若第i个仓库的库存量a[i]超出平均值,则移动一次(ans+1),将超出部分留给下一个仓库,既第i+1个仓库的库存量增加a[i]-ave;若第i个仓库的库存量a[i]
阅读全文