摘要: 有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。1:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v}2:f[v]=max(f[v],f[v-c[i]]+w[i]);完全背包面临的不是对于第i件物品选不选的问题了而是选多少件了问题了。。。所以f[v]的当前状态允许由当前状态推得。实现方法有是那种1:o(n*v)这里正确理解这句经典的话很关键(引用):换句话说,这正是为了保证每件物品只选一次,保证在考虑“选入第 阅读全文
posted @ 2011-12-06 17:15 E_star 阅读(299) 评论(0) 推荐(0) 编辑
摘要: 不多讲,dd大牛的背包九讲如此之经典我们只能慢慢体会了:有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。状态转移方程:1:f[i][v]=max(f[i-1][v],f[i-1][v-c[i]]+w[i]);2:for(i=0;i<N;i++){ for(v=V;v>=c[i];v--) { f[v]=max(f[v],f[v-c[i]]+w[i]); }} 自己的理解: 01背包的主要思想是对于这件物品做出选与不选的决定;将空间优化后V必须是逆序的,因为这样才能保证将当前的第i个物品放进去的时候,f... 阅读全文
posted @ 2011-12-06 17:03 E_star 阅读(318) 评论(0) 推荐(0) 编辑
摘要: 1001http://acm.hdu.edu.cn/diy/contest_showproblem.php?pid=1001&cid=13996原来做过的一道题目,我用的贪心,按比重从大到小排序,然后依次选直到不能再放进来为止。注意两点:1:F[j]可能为0因为题目中说的非负数。记得第一次做的时候wa无数次。。2:选完的时候有2种可能:1:n恰好用完,最后不能再选;2:n有剩余,可能n比较大把所有的都选了还有剩余,可能中间出现不能全部将这间屋子里的换完只能换部分。View Code #include <iostream>#include <cstdio>#inc 阅读全文
posted @ 2011-12-06 16:46 E_star 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 题目就是一个rmq算法的典型应用,关键是将其转化成rmq的形式,因为每个点都是a[i]<=a[i+1]所以对于每一个点记录他的左边与右边,因而可知他的长度(即出现的频率),然后还有一个值记录频率;最后求解是用的很巧妙的方法;View Code #include <iostream>#include <cstdio>#include <cmath>using namespace std;const int max_s = 100007;int f[25][max_s],hash[max_s],pow2[25],a[max_s];struct node{ 阅读全文
posted @ 2011-12-04 11:25 E_star 阅读(217) 评论(0) 推荐(0) 编辑
摘要: http://codeforces.com/contest/133悲剧啊。。又掉了rating。。越做越往下衰了啊。。呜呜。。看着队友们都三道题而且A的时间还很早。自己感觉到了很大的压力,总之要努力啊。。加油。。。A:http://codeforces.com/contest/133/problem/AYou have to figure out whether executing this program will produce any output.人家明明说了是否处理输出,自己还尝试各种情况,结果wa三次才过。B:http://codeforces.com/contest/133/pr 阅读全文
posted @ 2011-12-04 09:43 E_star 阅读(211) 评论(0) 推荐(0) 编辑
摘要: 好丢人的比赛啊。。一个都没对。。无语中。。考虑不全啊。。http://codeforces.com/contest/134/problem/A本来才开始考虑小数来,可最后还是在抓时间结构wa了。。就是很简单的求平均数然后在查找的过程。注意平均数可能是小数。。http://codeforces.com/problemset/problem/134/B题意:给出原始数对(1,1)到(n,x)变换求最小的步数。改变如下:(a,b)-->(a + b, b) or (a, a + b)才开始做的时候以为直接用a+b来替代a,b中较小的那个然后不断这样下去直到出现n。这样肯定保证的步数最小,才是样 阅读全文
posted @ 2011-12-03 20:09 E_star 阅读(198) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1506才开始以为从前往后找出连续的最长上升序列就行,结果一分析数据根本不行,然后从左往右找出分别找出来上升的最长自序列+连续下降的子序列然后分别求,最后取最大。结果还是不行,卡住了。原来是分别记录该点可延伸的最左边L[i]以及最右边R[i]最后由该点可形成的最大区域面积就是s=a[i]*(R[i]-L[i]+1);在求L,R是不能一个一个的往回找,肯定会超时,而是利用迭代的思想(想当于记录数组吧(dp))来推导。。由于自己的粗心重定向有没去掉贡献了一次无意义的wa。。呜呜。View Code #include 阅读全文
posted @ 2011-12-02 20:52 E_star 阅读(200) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1864一个0-1背包的题目,自己对背包的理解还是不好啊。将所给的最大报销费用当做背包体积,这里的最大陷阱是单项物品的价值不得超过600元(指的的是这一类产品)贡献了很多wa无语,还有就是数据的处理了。(计算内存1k=1024b);View Code #include <iostream>#include <cstring>#include <cstdio>using namespace std;const int max_s = 3000001;//靠计算的。。int f[ 阅读全文
posted @ 2011-12-02 16:57 E_star 阅读(233) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=295501背包的变形,才开始我就是按这别人说的脑残的办法将概率扩大100000被后计算,概率连续着加。。一直wa中。。无语 啊。最后原来是概率要连成乘的啊。。而且这里把抢劫的钱作为背包体积,V等于抢劫抢得最多的钱,然后直接套用01背包。。View Code #include <iostream>#include <cstdio>#include <cstring>using namespace std;double f[99999],p[107];int c[107];in 阅读全文
posted @ 2011-11-29 23:10 E_star 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 1001:求最大子段和,关键是判断当前位置选与不选的状态状态转移方程:dp[i]=max(dp[i-1]+a[i],a[i]);还要记录起点与终点(单独开了一个结构体记录到达每个点的起点与终点)http://acm.hdu.edu.cn/showproblem.php?pid=1003View Code 1 #include <cstdio> 2 #include <cstring> 3 int dp[100007],a[100007]; 4 struct node 5 { 6 int s,e; 7 }p[100007]; 8 int main() 9 {10 int 阅读全文
posted @ 2011-11-29 13:50 E_star 阅读(291) 评论(0) 推荐(0) 编辑
摘要: 1000 极度坑爹啊,谁都没想到会是普通的加法。。大整数肯定能过。。呵呵A+B;1001http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1001&cid=374题目也说了从大到小输出可是一排序就不对,最后听他们谁没排序就A了,我就把排序删了,可是老是PE,最后还要处理n==0是就没有人拿了输出换行(陷阱啊。。)贡献了9wa1003http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1003&cid=374这道题应该不是简单题了。将每个点存起来, 阅读全文
posted @ 2011-11-27 20:05 E_star 阅读(409) 评论(0) 推荐(0) 编辑
摘要: http://openoj.awaysoft.com:8080/judge/contest/view.action?cid=47#problem/Jhttp://poj.org/problem?id=1703并查集的题目,才开始做的时候就是想这把他们连接起来,(a,b)顺序从a找b,或从b找a,然后记录路径在判断:可是很多错误,还有在连接两点时部分节点的父亲加点要倒过来很是麻烦。。最后看了别人的结题报告soga..一个人不是属于集合 A,就是属于集合 B。这样,假设 A、B 两个人不是在同一个 gang 中,A、C 两个人不是在同一个 gang 中,就必定有 B、C 两个人在同一个 gang 阅读全文
posted @ 2011-11-27 00:56 E_star 阅读(294) 评论(0) 推荐(0) 编辑
摘要: http://openoj.awaysoft.com:8080/judge/contest/view.action?cid=47#problem/F一个素数帅选法的题目,才开始直接就套模板结构tle应为被题目中的As many as 1000 lines, 给坑了总的时间消耗是1000*10^5.。这样暴力枚举的话肯定会超时,当时就急了,一下把10^5以内的素数都搜出来了,打表水过。。然后为了问日华,原来在素数帅选完了以后再用dp处理一下就好了。。#include<iostream>#include<cstring>#include<cstdio>using 阅读全文
posted @ 2011-11-27 00:50 E_star 阅读(428) 评论(0) 推荐(0) 编辑
摘要: http://openoj.awaysoft.com:8080/judge/contest/view.action?cid=47#problem/G一个优先队列的题目,昨天刚做了一个用优先队列(stl)+bfs的题目,今天看到这个题瞬间1Y ou yeah!#include<iostream>#include<cstring>#include<cstdio>#include <queue>using namespace std;struct node{ char s[100]; int x,y; friend bool operator < 阅读全文
posted @ 2011-11-27 00:35 E_star 阅读(292) 评论(0) 推荐(0) 编辑
摘要: 第一题:http://openoj.awaysoft.com:8080/judge/contest/view.action?cid=47#problem/B就是一个贪心,才开始我是买饭时间从小到大排序做,结果贡献了好几次wa无语啊。。最后自己yy了一会发现应该是按吃饭时间从大到小排序,因为吃饭时间最长的先买饭吃饭这样后面的人在他吃饭的时候就可以把买饭与吃饭的事情就做完了。贪心很弱啊。#include <cstdio>#include <iostream>#include <iostream>#include <algorithm>using na 阅读全文
posted @ 2011-11-27 00:31 E_star 阅读(326) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1026才开始自己不清楚什么优先队列,就是直接从终点出发搜索直到找到出发点,记录最近。结果wa很多次,最后问了一下被人,才发现,最短的时间不是单调的每一步还要加上打怪的时间,yy了一下只要在每次出队列之前从小到大排一下队列里面的元素就行了啊。可是我的编码能力可能别太弱了结果没实现,于是就学习了stl中的优先队列的写法,stl 好强大啊。。思路:bfs,优先队列,pre数组记录后继元素,,ptr数组记录到该点的时间,最后递归尚未输出结果(这个地方很难想到,很巧妙)。。View Code 1 #include .. 阅读全文
posted @ 2011-11-26 11:47 E_star 阅读(295) 评论(0) 推荐(0) 编辑
摘要: 做这样的比赛既考快速编码的能力,还有快速思维的能力。本人很弱,跌了rating。。加油!!!。。第一题上来就把题意理解错了。。粗心啊。。直接模拟着做就行:1:如果字符串全是大写字母就进行大小写转换:2:如果除了第一个是小写字母其他都是大写字母就进行大小写转换:其他 原样输出。。ct记录大写字母的个数。。if(ct==len||(ct==len-1&&(str[0]>='a'&&str[0]<='z'))) 第二题:我直接就是二了。题目中说的是-10---10结果我二处理成-9--9了。。悲剧啊。。。记录每个数出现的个数 阅读全文
posted @ 2011-11-26 11:04 E_star 阅读(251) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1007一看题目就是一个很裸的最近点对。。暴力的做法是o(n^2)而对于o(nlogn)算法知识理论上理解了,但是还没实现过,好不容西写出来还是tle最后在gsb的指点下总算是A了。。汗。。#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>const int max_s = 100007;using namespace std;const int M = 99999999 阅读全文
posted @ 2011-11-24 22:27 E_star 阅读(323) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1028以为是个很简单的递推可是退了三页信纸都没推出来,最后还是看了人家的结题报告,好高深啊。。不好推;这里粘一下人家的吧,感觉很好:在正整数n的所有不同划分中,将最大加数n1不大于m的划分个数记为q(n,m)。可以建立q(n,m)的如下递归关系:<1>q(n,m) = 1, n >= 1当最大加数n1不大于1时,任何正整数n只有一种划分形式,n = 1 + 1 + 1 +...+ 1<2>q(n,m) = q(n,n), m >= n最大加数n1实际上不能大于n<3& 阅读全文
posted @ 2011-11-23 23:49 E_star 阅读(241) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1598才开始是我看着没什么思路,心想就用dfs暴搜试试吧(本人太爱dfs了)。结果加了各种剪枝都都是TLE无语。。最后听von说用并查集,给我讲了讲才明白,不过开始的时候把边的最大值开成点的最大值了贡献了4次wa才检查出来。。无语了,自己太马虎了。。思路:先将各个边按限速排序,然后从最大的开始里循环用并查集建树,直到起点与终点的父亲相同说明此事s与e已经建立联系,然后用开始循环的节点的速度(该路线上的最大速速)减去最后将s,e连接的边的速度就是该路径上的Vmax-Vmin的最小了。。#include < 阅读全文
posted @ 2011-11-23 23:43 E_star 阅读(284) 评论(0) 推荐(0) 编辑