01 2013 档案
摘要:题目链接:http://poj.org/problem?id=1679 求是否存在多个最小生成树,其实就是求次小生成树的权值是否等于最小生成树。 最小生成树的两个性质: 1.切割性质:假定所有边权值不相等,设S为即非空集合也非全集V的子集,边e是满足一个端点在S内,另一个端点不在S内的所有边中权值最小的一个,则图G的所有生成树均包含e。 2.回路性质:假定所有边权值不相等,设C是图G中的任意回路,边e是C上权值最大的边,则图G的所有生成树均不包含e。 求次小生成树一遍朴素的做法就是枚举最小生成树中的边删去,然后再在图上求最小生成树,复杂度O(n*m*lgm);对于稀疏图来...
阅读全文
摘要:题目链接:http://poj.org/problem?id=3635 容易想到用二维数组记录状态求最短路,然后用优先队列优化,类似于Dijkstra和BFS。我开始设计的过程是直接直接从当前点向相邻点转移并找出所有可能状态,结果TLE。貌似是无关状态太多了,没想到卡得这么紧。别人的做法是只考虑两个状态:1、加一单位油 2、向相邻点移动;这样就砍掉了一些对最优解不必要的状态。 1 //STATUS:C++_AC_297MS_2404KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h>
阅读全文
摘要:题目链接:http://poj.org/problem?id=2728 01规划问题,二分+prim。注意这里的图是稠密图,应该用prim而不是kruskal。堆优化的prim不适合稠密图,也不适合邻接矩阵建图,否则基本上没怎么优化O(n*(lgn+n)),因为每次操作的常数因子很大,所以lgn与n的差别不大了,尤其在n比较小的时候。我这题用堆优化的prim居然还超时了! 1 //STATUS:C++_AC_1079MS_8124KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h>
阅读全文
摘要:题目链接:http://poj.org/problem?id=2976 很典型的01分数规划,sort+二分即可。注意精度问题,这种四舍五入的问题一般都是两种处理方法:1、printf("%.0lf\n",ans); 2、printf("%d\n",(int)(ans+0.5)); 1 //STATUS:C++_AC_47MS_196KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #i
阅读全文
摘要:题目链接:http://poj.org/problem?id=3621 这题是01分数规划问题,详细资料点这里。有了01分数规划的基础后,这个题目就很简单了。构建函数f(mid)=Σ(w[i]-mid*d[i]),然后二分mid,如果图中有正权环,则f(mid)>0,则还有更优解l=mid,否则r=mid。 1 //STATUS:C++_AC_563MS_296KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #incl
阅读全文
摘要:题目链接:http://poj.org/problem?id=3613 很好的一道题目,求在一个无向图上,经过n条边的两点之间的最短路。 推荐看 IOI国家集训队2008俞华程《矩阵乘法在信息学中的应用》 和 Matrix67<十个利用矩阵乘法解决的经典题目>的文章。 首先我们在求无向图上求任意两点间有多少条路径的时候是通过矩阵相乘来求的,即A^2矩阵上A[i][j]表示i->j长度为2的路劲有多少条,然后看Floyd的状态转移方程:f[i][j]=Min{ f[i][k]+f[k][j] | 0<k<n },是不是跟矩阵相乘很像,因此我们改造想到改造矩阵乘法,把
阅读全文
摘要:题目链接:http://poj.org/problem?id=3463 给定一有向图,要你求出最短路的数目和最短路长度+1的数目。 比较方便的办法就是在Dijkstra的时候就直接把数目求出来,Dijkstra基于贪心的思想,一个点向其它点松弛后,那么就不会有后继点向此点松弛,因此可以来统计总共有多少条路径:1,更新v点最短距离后,v点路径数目等于u点路径数目 2,如果到点u到点v有等于v点当前的最短路径,则v点的路径数目加上u点的路径数目。求最短路长度+1的数目实际上就是求次短路的数目,如果次短路长度刚好比最短路长度大1,那么就是答案的一部分。注意到这个次短路比较特殊,之比最短路大1...
阅读全文
摘要:题目链接:http://poj.org/problem?id=3013 题目大意是给你一颗树,树的边权值是当前边的所有儿子节点的权值之和*树边的固定花费,求整棵树的最小的花费。可以看出,每个儿子节点他的所有的祖先都有一个花费贡献值,要使得总共的花费最小,那么就要使他到根节点的固定花费最小,就是一个最短路的模型了。题目要注意几点:1,图是无向图 2,数据超int 3,注意n=0和n=1的情况。 1 //STATUS:C++_AC_594MS_4312KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<stri
阅读全文
摘要:题目链接:http://poj.org/problem?id=1584 首先判断是否为凸多边形,叉积判断即可,然后判断点是否在多边形内,先用叉积然后点到直线距离。 1 //STATUS:C++_AC_0MS_192KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 9 #in
阅读全文
摘要:题目链接:http://poj.org/problem?id=1408 比较简单的题目,只是处理上麻烦了一点。 1 //STATUS:C++_AC_32MS_208KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 9 #include<vector>10 #in
阅读全文
摘要:题目链接:http://poj.org/problem?id=1039 比较有意思的一道题目,用光线射入一个管道,文最多能射多远。在最优解中一定存在光线紧挨着管道弯折点的情况,题目数据比较小,因此我们可以枚举管道上的两点,然后求出这条光线能入射的最远距离。只要判断当前直线管道壁是否相交,这里可以判断直线是否与对应的两个弯折点相交,如果相交,则直线合法,反之亦然,这样做方便处理。 1 //STATUS:C++_AC_32MS_188KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h>
阅读全文
摘要:题目链接:http://poj.org/problem?id=2031 很典型的最小生成树题目。 1 //STATUS:C++_AC_0MS_252KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 9 #include<vector>10 #include<
阅读全文
摘要:题目链接:http://poj.org/problem?id=2635 重点在万进制优化,主要是mod操作少了很多。 1 //STATUS:C++_AC_938MS_4432KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 9 #include<vector>1
阅读全文
摘要:题目链接:http://poj.org/problem?id=1942 水题一枚,递推求解组合数即可。 1 //STATUS:C++_AC_16MS_184KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 9 #include<vector>10 #includ
阅读全文
摘要:题目链接:http://poj.org/problem?id=1019 水题一枚,分段查找即可,只是处理上要注意细节。 1 //STATUS:C++_AC_0MS_428KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 9 #include<vector>10
阅读全文
摘要:题目链接:http://poj.org/problem?id=1080 题目大意是匹配DNA分子,使得DNA可能性最大。开始自己想的是O(n^3)的算法,构造字符串,然后在状态转移,结果POJ过了,但是HDOJ WA,果然POJ的数据比较水,但是现在还没有想出问题在哪里(明天把问题找出来)。其实这个类似于LIS,基本模型:E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij}。 POJ AC/HDOJ WA代码: 1 //STATUS:C++_POJ AC/HDOJ WA_79MS_584KB 2 #include<stdio.h>
阅读全文
摘要:题目链接:http://poj.org/problem?id=2533 基本DP:f[i]=max{f[j]}+1。 1 //STATUS:C++_AC_32MS_184KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 9 #include<vector>10
阅读全文
摘要:题目链接:http://poj.org/problem?id=1260 基本DP,只要证明最优解中不会有交叉替换,得出转移方程:f[i]=min{f[j]+(a[j+1]+..+a[i]+10)*p[i]}。由(ai+10)*bi+(aj+10)*bj=(ai+aj+10)*bj ==> (ai+10)*bi=ai*bj 替换==> t*bi=ai*bj 可证。 1 //STATUS:C++_AC_0MS_176KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #
阅读全文
摘要:题目链接:http://poj.org/problem?id=3267 题目大意是,给定一个文本串和n个模板串,要你去掉文本串中最少的字母,使得文本串能连续的被模板串匹配。有点像LIS,基本的DP模型:E[j]=opt{D+w(i,j)}。用f[i]表示前i个字符连续被模板串匹配时去掉的最少的字符个数,则f[i]=min{f[j]+(i-j+1)-max{lengthstring}},(0<=j<=i-1)。lengthstring为在i-j子串中能被匹配的模板串的长度。如果我们在没求一次i-j时就去匹配判断一次,复杂度有点高。这里显然可以优化,就是从后开始判断,然后依次记录每个模
阅读全文
摘要:题目链接:http://poj.org/problem?id=1837 题意是给定一个平衡杆,平衡杆的两端某些位置有钩子可以放置砝码,现在给定一些砝码,要你求出有多少种方法能使之保持平衡。方法是用平衡度的方法来进行状态转移,f[i][j]表示前i个物品的平衡度为j时的状态总数,则转移方程为f[i][j+c[k]*g[i]]+=f[i-1][j],显然f[m][0]就是最终答案,不过数组下标不能为负数,映射一下就可以了。 1 //STATUS:C++_AC_16MS_1632KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #in
阅读全文
摘要:题目链接:http://poj.org/problem?id=2513 建立无向图,看图是否存在欧拉道路。首先判断图是否连通,可以用并查集或者一遍BFS判断,最后判断入度数就可以了。 1 //STATUS:C++_AC_1266MS_79348KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algo
阅读全文
摘要:本文根据经典的TC教程完善和改编。TopCoder:http://www.topcoder.com/基本规则TopCoder的比赛类型很多,最常见的是周赛SRM(Single Round Match),另外还有TCHS SRM(TopCoder High School SRM,题目和SRM一样,仅限中学生参加,参赛者水平较低,据说涨rating很容易),马拉松(Marathon Matchs),还有TCOpen(每年两次的大比赛)之类的比赛。因为大多数人都在做SRM,所以本文介绍的TC比赛即为SRM。SRM的规则总结起来就是一句话:75分钟做完3道难度递增的题。TC的每个用户(handle)都
阅读全文
摘要:一、TC基本介绍TC的网址www.topcoder.com/tc,我们一般提到TC的时候是特指其中的Single Round Match(SRM)。SRM的规则总结起来就是一句话:75分钟做完3道难度递增的题。TC的每个用户(handle)都有自己的积分(rating),从0-3000+不等。成绩越好,分数越高。积分与颜色的对应为:白色——未参赛(unrated);灰色——0~899;绿色——900~1199;蓝色——1200~1499;黄色——1500~2199;红色——2200+。另外排名最高的几个人在TC客户端中会变成红色靶子图标。比赛分为两个Division,Div I和Div II。
阅读全文
摘要:转载Nazgul的,这玩意果断神了。。e100 33 f6 bf 0 20 b5 10 f3 a5 8c c8 5 0 2 50 68 13 1 cb e 1f be a1 1 bf 0 1e11b 6 57 b8 11 1 bb 21 13 89 7 4b 4b 48 79 f9 ad 86 e0 8b c8 bd ff ff e8 20e134 0 3d 0 1 74 1a 7f 3 aa eb f3 2d ff 0 50 e8 f 0 5a f7 d8 8b d8 26 8a 1 aae14f 4a 75 f9 eb de cb 57 bb 21 13 8b c1 40 f7 27 f7
阅读全文
摘要:题目链接:http://poj.org/problem?id=3253 题目大意是,把一块长木板割成n快给定长度的木板,每次的花费为当前模板的长度,求最小的花费。逆向求解即可,贪心的思想,每次取两块木板长度最小的,花费为量长度之和,然后把新的长度加进去,操作n-1次,就是一个huffman树的构造过程。然后用优先队列搞之。 1 //STATUS:C++_AC_16MS_348KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #
阅读全文
摘要:题目链接:http://poj.org/problem?id=2151 组合数做肯定超时,容易看出是DP。f[i][j]表示某个队的前j个题目做出i个题目的概率,则f[i][j]=f[i][j-1]*(1-num[j])+f[i-1][j-1]*num[j]。接下来就直接好求了,对每个队求出至少答对一个的概率,然后依次相乘就是满足题目的第一个条件,然后再减去每个队答对n-1个的概率的积就是最终概率了。 1 //STATUS:C++_AC_32MS_192KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<s
阅读全文

浙公网安备 33010602011771号