09 2012 档案
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1059题意: 给出价值分别为1-6的东西 , 输入代表价值为1-6的个数 , 现在问你将这些东西完全平分成两份 , 看能不能刚好平分.坑爹: 我一开始是想用多重背包算出 DP[sum] 然后在看下 DP[sum/2] 是不是刚好是sum的一半 , 但这样会超时解法: 用多重背包 把背包的 "体积" 定为总价值的一半就是行了 , 不需要算到 "体积" 为sum .View Code 1 #include<iostream> 2 using namespace
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1171题意: 给定你每种设备的价值和数量 , 要你将这些设备平分( 就算不是刚好平分也要尽量接近).坑爹: 一开始看到这题是一点思路都没有 , 以为一定要刚好平分 . 数组要开到 50 * 50 * 100 .解法: 只要将所有设备的价值加起来(sum) , 然后利用多重背包 , 但"背包"的容量不是sum , 而是sum/2 , 这样就可以找出当"背包"的容量为总价值一半的时候的最优情况 , 然后另外一边分到的设备就是 sum - DP[sum/2] .View Co
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1114题意: 有T组测试数据,后面的E和F分别表示存钱罐空的时候的重量和满了的时候的重量 , 然后有个m ,代表下面有 m 种钱币 , 每种钱币分别有他的面值和重量 , 要你求出当存钱罐满的时候 , 存钱罐中至少有多少钱.坑爹: 因为他是要求出最少有多少钱 , 所以要 DP[ j ] = min ( DP [j ] , DP[ j - cost ] + weight )还有一点要注意的是DP数组的初始化 , 要初始化为最大值 , 因为它每次都要求最小的一种情况 , DP[0] = 0是递推的一个开始.解法..
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1237题意: 给你一个只有+ - * / 的计算表达式 , 要你求出结果.坑爹: 一开始我只是以为只要在输入的时候遇到*或者/就弹出来进行计算,然后在到最后计算 + 和 - 的时候直接弹出一个一个计算,最后才发现原来在最后弹出来计算的时候要全部反过来,不能直接弹出就计算然后压入.解法: 遇到 * 或者 / 就弹出两个进行计算, 然后压入结果 , 到最后的时候把栈里的数字反过来,也就是用一个数组从0 - n开始存每一个出栈的数字 , 符号栈也是相同的操作 , 然后就可以进行正常的按顺序这样做 + 和 - ...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1028题意: 给你个数N,要你拆分成很多个数字的和。坑爹: 但不能出现 4 = 3 + 1 和 4 = 1 + 3 这样是算重复的。解法: 每次对一个数N进行 ( 1 - N)的放与不放的试探, 比如说5,不放5的最优解就是在与现在相同负重的时候放了4的解,放5分就等于 f [j-5] + weight 这两种情况加起来就是 5 的最优情况。View Code 1 #include<iostream> 2 using namespace std; 3 4 const int maxn = 120
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2159题意: 给出的n , m , k ,s 分别代表还需n经验升级、还有m耐久度、下面有k组数据、最多能杀s只怪,下面k组的a和b分别代表杀一只这种怪要消耗b耐久度获得a经验,让你计算出在耐久度和杀怪数范围内能不能获得题目给出的经验。坑爹: 一开始我想的时候以为是多重背包的问题,我以为是每种怪都能杀s次,其实是总共只能杀s只怪,所以不能用多重背包做。解法: 二维费用的背包问题,用一个DP的二维数组,DP[ i][ j] i 代表杀怪数 , j 代表耐久度 。因为每个怪可以打多次,所以Pack函数里的循...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2191题意: 给出大米的价格、重量和袋数,要你计算出在规定的钱数内买最多(重)的米。坑爹: 算是多重背包问题的模版题吧。解法: 多重背包。View Code 1 #include<iostream> 2 using namespace std; 3 4 const int maxn = 20000 + 10; 5 int n; 6 int DP[maxn]; 7 8 int max(int a,int b) 9 {10 return a > b ? a : b;11 }12 13 void.
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1284题意: 给个整数N(分),只能用1分,2分,3分,进行兑换,计算出有多少种兑换方法。坑爹: 简单的完全背包。解法: 当前的兑换方法 f [ j]等于放入某一种钱币和没放入某一种钱币之和,放入某种钱币又分放了多少个,将放了1到最多个的方法加起来就是放入某种钱币之和。View Code 1 #include<iostream> 2 using namespace std; 3 4 const int maxn = 32768 + 10; 5 const int INF = -1 * 0x7fff
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1258题意: 第一个数为sum,第二数N为后面有长度为N的序列(后一项小于等于前一项),要在这个序列中找出一组数加起来等于sum。坑爹: 要输出所有的情况,但不能重复。解法: 用DFS的时候每次按顺序在num数组中找到一个值然后判断有没超过sum,没有的话就把它记录在save数组中,然后再用review记录当前num[ i] 的值,这样的话在DFS完成之后再找下一个值进行试探的时候就要判断是否与review的值相同,相同的话就不用再进行DFS了(序列是严格的后一项小于等于前一项,所有review的值一旦...
阅读全文
摘要:http://poj.org/problem?id=2184题意: 第一行为N,代表下面有N组数据,下面每一行有S和F分别代表一头牛的智商和幽默度(有正有负),现在要你算出要选哪些牛,是求当智商大于0时,幽默度最大的时候的智商与幽默度的总和,总和如果为负的话输出0,正的话直接输出总和的值。坑爹: 因为这相当于01背包的问题了,智商为背包中的体积,幽默度为背包中的价值,但是智商可能为负,访问数组下标的时候会错误。 初始化要将 数组 f 赋值为 -0x3fffffff(其实-200000就够了)并把f[1000000] = 0 因为幽默度能可能出现负数。解法: 要解决数组下标可能会访问到负...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2647题意: 输入N和M代表N个人和M组数据,M组数据中的A和B代表A的工资要比B的工资高,底薪是(888元),问你这个老板至少要付多少钱给这些员工,A比B工资高就是说A的工资“至少”比B高1元,当拓扑排序出现环的时候输出 -1 ,否则输出老板要给的钱数。坑爹: 用拓扑排序找到入度为0的所有的点都有着同样的工资。 例如:1-2 3-4 这样1和3都为889元,2和4为888元,所以老板所付的总工资为3554元。解法: 在每次调用cut函数的时候都要访问与他相邻的边的点的入度,每访问一次IN[ map[ ...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3342题意: 输入N,M代表有0~N-1的点,M组数据 ,输入的每组数据代表 a指向b ,然后用这M组数据构成一个有向图,判断这个图有没有环,有就NO,没有就YES。坑爹: 用了vector开的数组,如果中途发现 k == -1 的时候,有很多节点没有删除,所以要在每一次拓扑完之后将map数组清空。解法: 利用拓扑排序,每次找入度为0的点,然后把与他相连的边清除掉,并且将与他相连的点的入度减1。View Code 1 #include<iostream> 2 #include<vector&
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1160题意: 要选出一组序列,求老鼠的体重是递增的,而老鼠的速度是递减的这样的序列长度最长是多少,答案有很多种,输出一种即可。坑爹: 用数组 cd 来记录第i只老鼠前面有多少只是符合条件的,但一开始我是让 j = i - 1 ~ 0 这样找,找到就break,但这样不行,比如说:重量 速度cd数组的值500 50 1100030 21100 90 14000 30 2这样就不对了,是要找到前面能符合条件的最大的cd值。解法: 将num数组(存输入的值)进行排序,根据老鼠的重量进行由小到大排序,利用 数组...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2955题意: 第一行第一个小数,是这个人被抓住的概率最大不能超过这个数,第二个是有N个银行。一个整数和小数分别为这个银行有多少钱和被这个银行抓住的概率。求出这个小偷在不超过自己抓住的最大概率中抢更多的银行。坑爹: f 数组 初始化为0 ,但是 f [0] 要为1,因为不抢任何银行的时候永远是成功的。所有银行的钱数加起来是“背包”的容量,不被抓的概率是价值。解法: 套用01背包的状态转移方程,解出不被抓住的概率,然后用1减去它,再和被抓住的概率比较。View Code 1 #include<iostre.
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2546题意: 给你一些饭菜的价格,和你饭卡的余额,余额大于等于5元时可以刷任何价格的菜,算出你买了这些菜之后饭卡中最少的一组解(余额可以为负)。坑爹: 这道题中,他的价格也就是背包中的容量,也是背包中的价值,总余额如果超出5元要将总余额减去5元的钱尽量用掉。 解法 用到了一点贪心的思想,用一个sort排序,将便宜的菜买了,尽量将饭卡里的余额靠近5元,然后在买一个最贵的菜,这样就会让饭卡里的余额最少了。View Code 1 #include<iostream> 2 #include<algo
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1203题意: 一道01背包的水题,每一行分别是申请所需的费用和被录取的概率,Speakless只有一定的钱,要在这些规定的钱内找到至少能被一所学校录取的概率的最大值。坑爹: 才刚开始看01背包问题,对初始化的的操作不是很清楚,而且这个在计算f[n]的时候要尽量的小,而达到1-f[n]最大。解法: 套用01背包的公式,而且将 f 数组全部初始化为1,从而保证没有一所学校录取的时候 1 - f [n] 为 0.View Code 1 #include<iostream> 2 using namespa
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1162题意: 给出N个坐标,坐标之间的距离就是权值,是个最小生成树的问题,用Kruskal算法做。坑爹: 一道简单的最小生成树的题目,N个点对应要有N-1条边,没什么难点主要是要细心点就行了。解法: Kruskal算法的模版一套上去就行了。View Code 1 #include<iostream> 2 #include<math.h> 3 #include<algorithm> 4 using namespace std; 5 6 const int maxn = 100
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2602题意: 给你N根骨头,分别有它们的价值和体积,他的袋子有规定最多能装多少体积的骨头,需要你求出他收集的骨头的总体积不超过他的袋子的情况下算出袋子中骨头价值最高的一个解。坑爹: 今天才刚看 01背包 ,现在也不是太明白吧,这题是水题,只要套下公式就出来了。解法: 用01背包那个状态转移方程(资料上复制的伪代码)for i=1..N for v=V..0 f[v]=max{f[v],f[v-c[i]]+w[i]};View Code 1 #include<iostream> 2 using na
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3790题意: 普通的最短路问题,只不过加了个费用,在有多条最短路的情况下输出花费最少的那组答案.(双重权值)坑爹: 有重边的情况,开始做的时候当判断重边比原来小的时候,还去判断费用是不是比原来小..这样就会出错..是在找最短路径的前提下找到最小的花费.disprice数组和dis数组同步操作,但对dis进行松弛的时候,如果经过另一条路径在到目的地就要比较这两条路哪变的费用少.解法: 用个Dijkstra算法将dis和disprice进行松弛解出答案.View Code 1 #include<iostr.
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2553题意: 给出个N,代表N*N表格,在里面放N个皇后,要保证每个皇后之间不会攻击到,皇后的攻击范围:自己所在的那一行,自己所在的那一列,自己所在的两条45度对角线。坑爹: 如果输入一个N就去搜一次的话,数据给出每一次的N都是10的话就会超时。解法: 反正这题N最大才10,就把1到10的结果先保存在数组中,然后每输入一次N就利用下表访问一次数组得到答案。View Code 1 #include<iostream> 2 using namespace std; 3 4 int N; 5 int c
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1728题意: 一个迷宫...从起点走到终点,拐弯次数有限制的情况下找到最优的解。坑爹: 本来用结构体来记录坐标、走的步数和拐弯次数,但是发现如果搜一条路径发现行不通的话这条路上所有点都被标记了,当我再次经过这里面的某个点的时候就不能通过了。比如说我一开始行不通的那条路通过某个点是左右通过的,但我下次再要从上或者从下经过这个点的时候就会过不了。解法: 每次向一个方向拓展时将这一个方向所有满足条件的点全部进队,这样就解决了某个点不会因为之前被标记过而导致下一次以另外一个方向进入这个店的时候就不给经过的问题。...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1253题意: 一个三维的空间坐标分别表示为(x,y,z),Ignatius要从(0,0,0)开始逃,要到出口(A-1,B-1,C-1),他只能往6个方向走(上下左右前后),每走一步算一个单位时间,要在魔王回来的时候内走到出口(刚好也算逃出)。坑爹: 这题的数据很恶心,害我WA了很多次,当A==B==C==1的时候也就是入口就是出口的时候,要分入口(出口)是不是墙,如果是则不能逃出,反之可以逃出,解法: 广搜。View Code 1 #include<iostream> 2 #include<
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1690题意: 第一行数据分别为L1.L2.L3.L4.C1.C2.C3.C4,和坐出租车的意思是差不多的,在行驶了0到L1距离的时候价格为C1,L1到L2之间的时候用C2 ......第二行N和M代表在下面有N个站(坐标),M个问题。计算出一个站到另一个站所需的最少的钱。Sample:1 2 3 4 1 3 5 74 212341 44 11到4直接不换乘的话需要5元,但在1-2,2-3,3-4这样换乘的话只用3元。坑爹: 数据比较大,要用__int64,我把INF值直接改成了-1这样虽然多了几条语句但思..
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1385题意: 输入一个N*N的矩阵,(x,y)代表城市x到城市y所花费的钱,后面有一行b1,b2......bn代表经过城市n所需的费用,后面是几组问题(a,b)也就是要你计算出a到b的最少花费的费用(a、b不收费),并且要输出路径。坑爹: 要求输出最小的那一组解 ,也就是说当 1-2-3-4 和1-5-3-4花费的费用是相同的时候要输出1-2-3-4。解法: 路径用一个path数组,初始化将path[i][j] = j ,在Floyd中只要满足map[i][j] > map[i][k] + map[k
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1272题意: 要你判断是不是一个迷宫,条件是每两个点之间只能有一条边相连。坑爹: 判断有无回路。解法: 输入的时候判断这两个点的father值相不相等,如果相等的话就代表原来这两个点就是想通的,如果在进行Union的话就会出现环。View Code 1 #include<iostream> 2 using namespace std; 3 4 const int MAXN = 100000 + 10 ; 5 int flag[MAXN]; 6 int father[MAXN]; 7 ...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1142题意: Jimmy在位置 1 ,每天晚上要回位置2(家),计算1到2的最短距离,Jimmy要先去一个地方然后再回家,到了那个地方离家的距离不能大于1到2的最短距离,计算出有多少种这样的走法。坑爹: 当用DFS搜索有多少条路径时会超时。解法: 剪枝:用mark数组记录上一次走到这一个点在往下走有多少条路径时符合条件的。View Code 1 #include<iostream> 2 using namespace std; 3 4 const int MAXN = 1000 + 10 ; 5
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1518题意: 给出M根棍子,要将所有棍子用上,拼成一个正方形。坑爹: 用深搜时递归容易超时。解法: 剪枝:用一个pos来记录当前搜索到的位置,当下次继续加一个棍子时从pos位置开始,因为前面的可以加的都已经标记过了,而每递归一次都要从头开始搜索,浪费了很多时间。View Code 1 #include<iostream> 2 using namespace std; 3 4 const int maxn = 20 + 10; 5 int num[maxn]; 6 bool used[maxn];
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1372题意: 一个8*8的正方形棋盘,行用a-h标记,列用1-8标记。 给定两个坐标,要求你从一个坐标到另一个坐标的最小步数。 移动和象棋中的马一样,走 “日” 字。坑爹: 英文太难了,半天不知道走 “日” 字 ,真是我日啊。解法: 广搜八个方向。View Code 1 #include<iostream> 2 #include<queue> 3 using namespace std; 4 5 int map[8][2]={{2,1},{2,-1},{1,-2},{1,2},{-1,
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2473题意: N是 标号为 0~(N-1)的邮件 M是有M行数据。 第二行开始为数据 当输入为M时之后跟着的两个编号表示这两封邮件都为一种垃圾邮件。当输入为S时跟着的一个标号表示这封邮件被误判,这不是封垃圾邮件,而之前与这封邮件同时被判为垃圾邮件的那封邮件还是垃圾邮件。输出为有多少种邮件(垃圾邮件也分很多种)。坑爹: 1.当要将一封垃圾邮件变为普通邮件时,如果在这个垃圾邮件的树中作为根的话,那么变为普通邮件时要将剩余的垃圾邮件重新合并起来。 2.当要搜索有多少个集合(邮件种类)的时候要查找 fathe...
阅读全文
浙公网安备 33010602011771号