acm/icpc
文章平均质量分 77
tzw_cs
这个作者很懒,什么都没留下…
展开
-
面试题:有限制条件的全排列数
给定一个数组,例如[45,54,2,99,1]给定一个长度l,例如100可以对数组中相邻的两个数交换,前提必须满足两个数的和不大于l求通过这种交换所能够产生的全排列有多少种?对于相同的数,也默认它们不同。这是某外企的电面题,感觉要找到比较好的算法还是挺难的。目前想到的是一种循环暴力搜索加暴力剪枝并回溯的,从测试数据来看,效果还凑合。思路是:暴力搜索:查看任何原创 2014-11-14 16:17:46 · 1283 阅读 · 0 评论 -
多重背包问题解法简单分析(POJ 1276为例)
先简单介绍几种背包问题:01背包(ZeroOnePack): 有N件物品和一个容量为V的背包, 每种物品均只有一件。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。 完全背包(CompletePack): 有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容原创 2012-12-05 19:36:30 · 1031 阅读 · 0 评论 -
系列前m大数算法总结
有的时候想想懒得每次遇到类似问题就重新编代码,所以主要是为了保存代码,就重新记录一些简单题的解法。问题:给定一个无序系列包含有n个数,求其前m大数算法:1. 对该系列进行排序,然后取前m大的数。算法时间复杂度为O(nlogn)2. 如果m比较小,对系列流有序保存前m大数,时间复杂度为O(mn)3. 维持一个m个元素的最小堆,该堆保存的是前m大数,新添加的数只要跟该堆中最小数比较,若大则替换并调整堆原创 2012-12-05 19:36:11 · 1029 阅读 · 0 评论 -
poj 3865 数据库冗余问题判断
问题:给定由1-n索引的两列数据,问是否存在两行的某两列列值完全相同,即k1.c1 = k2.c1且k1.c2 = k2.c2办法1:对第一列排序(o(nlogn)),找到第一列中列值相同的(mi个)在第二列中根据相应索引取出所有值并排序(o(milogmi)),顺序找出值相同的(mi)。总时间复杂度为o(nlogn+∑(mi+milogmi+mi))=o(nlogn+2n+∑milogmi)=o原创 2012-12-05 19:35:47 · 1251 阅读 · 0 评论 -
poj解题报告整理
2011-04-29整理 poj 下载源码:http://download.csdn.net/source/2854844poj 1080 动态规划poj 1141 动态规划poj 1961 KMP串匹配poj 2406 KMP串匹配poj 3614 贪心解决最大匹配poj 3659 树形dppoj 3674 之枚举+贪心与搜索POJ 3821 ClickomaniaPOJ 3842 排列问题po原创 2012-12-05 19:35:43 · 1330 阅读 · 0 评论 -
POJ 3842 排列问题
给定几个数,求其排列排列问题可以转化为递归搜索~低位安排不同的数,求剩下的数的排列,再递归效果还不错,时间效率暂时第一啊,还是我在poj的首次哦http://poj.org/problemstatus?problem_id=3842#include using namespace std;int prime[5000],pn,num[10],res,tab[10],sl;bool p[10000]原创 2012-12-05 19:35:37 · 575 阅读 · 0 评论 -
图中最短路径算法
DijkstraDijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。时间复杂度我们可以用大O符号将Dijkstra算法的运行时间表示为边数m和顶点数n的函数。Dijkstra算法最简单的实现方法是用一个链表或原创 2012-12-05 19:35:13 · 1208 阅读 · 0 评论 -
一二维树状数组模板
具体参考: http://poj.org/summerschool/1_interval_tree.pdf一直没有搞清 线段树和树状数组的区别及用途,下面从该讲义中摘录:树状数组:适合单个元素经常修改而且还反复要求部分的区间的和的情况。上述问题虽然也可以用线段树解决,但是用树状数组来做,编程效率和程序运行效率都更高。上述问题虽然也可以用线段树解决,但是用树状数组来做,编程效率和程序运行效率都更高如原创 2012-12-05 19:34:41 · 357 阅读 · 0 评论 -
二分图的一些概念
什么是二分图若图G的结点集V(G)可以分成两个非空子集 V1和V2,并且图G的任意边xy关联的两个结点 x、y分别属于这两个子集,则图G是二分图。所有的树都是二分图。从树中任取一个结点为树根,着上白色,然后将根的所有孩子着上黑色,将下一层再着白色,继续此过程直到所有结点都着色。用着色法或标记法可以检测一个给定的图是不是十分图。偶数个结点的圈是二分图,而奇数个结点的圈不是二分图。所以如果图中含有奇圈原创 2012-12-05 19:34:31 · 3106 阅读 · 0 评论 -
2008北京regional网络预选题
http://acm.bjtu.edu.cn/OnlineJudge/problem?pid=1000题意:n个学生标号为1,2,……,n,围成一个圆环,从1开始每隔一人踢出一人。给定某人的编号和当要踢出他的时候的剩余人数(他还未踢出)。求n的最小值。开始一轮偶数被踢出,但因为n值的变化,奇数则不一样,可能首先踢的是4*r+1,也可能是4*r+3,因而可以把他们重新排列变化成1,2,……,[n/2原创 2012-12-05 19:34:22 · 315 阅读 · 0 评论 -
poj 3674 枚举+贪心与搜索
http://acm.pku.edu.cn/JudgeOnline/problem?id=3674看了别人的代码,好久才领悟到什么意思,于是就写了个 枚举+贪心 但耗时比较多,1400多ms。主要是应在每种级别中选取攻击力前六的,这样得到的规模最大为66.#include #include #include using namespace std;vector v[11原创 2012-12-05 19:34:27 · 514 阅读 · 0 评论 -
给定大小不同币值和一定的钱求组合方法数
求方法数:给定币值大小不同,和一定的钱求组合方法数:题目:1762: DollarsNew Zealand currency consists of $100, $50, $20, $10, and $5 notes and $2, $1, 50c, 20c, 10c and 5c coins. Write a program that will determine, for any given原创 2012-12-05 19:33:26 · 589 阅读 · 0 评论 -
质数构造以及质因数分解模板
【质数构造以及质因数分解】int primes[N],cnt,factor[50],facnum;void makeprimes(){primes[0]=2;primes[1]=3;cnt=2;int i,j;for(i=5;i{ for(j=1;primes[j]*primes[j] if(i%primes[j]==0) break; if(primes[j]*pr原创 2012-12-05 19:33:43 · 504 阅读 · 0 评论 -
Morris Traversal: 非递归不用栈实现对树的中序遍历
参考:http://www.geeksforgeeks.org/inorder-tree-traversal-without-recursion-and-without-stack/1. Initialize current as root 2. While current is not NULL If current does not have left child a)原创 2014-10-22 13:49:28 · 971 阅读 · 0 评论 -
后缀数组
后缀数组是用来替代后缀树的一种比较巧妙的数据结构,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也不太逊色,并且,它比后缀树所占用的空间小很多。详细参考百度百科的介绍:http://baike.baidu.com/view/1240197.htm在概念方面,百科里面介绍的比较清楚,这里就不再重复了。但是里面在具体思路及编程实现方面介绍的有点混乱(个人觉得),因而这里根据自己的理解再做原创 2012-12-05 19:36:15 · 503 阅读 · 0 评论 -
poj 3899 The Lucky Numbers
http://poj.org/problem?id=3899思路:1. 可以总结出n位数的lucky numbers有2^n个2. 求[A,B]间的lucky numbers个数,如果A和B位数相同,则求f(A,B),否则造出一个数C=99…9,位数和A相同,一个数D=11…1,位数和B相同,求f(A,C)+f(B,D)+2^i(i为大于A的位数小于B的位数的所有整数)现在就转化为求子问题f(A,原创 2012-12-05 19:35:41 · 762 阅读 · 0 评论 -
POJ 3821 Clickomania
http://poj.org/problem?id=3821遍历搜索:用数组保存中间结果(类似动态规划思想)几种情况:串AxAyAz1. Ax:最开始的相同字母串A可以消掉,判断x,可消返回真,否则继续;2. AxAz:首字母串肯定要与后面的字母串合起来一起消,问题变为判断AxA和yAz(可能不含A)两个子串;3. AxA: 输入串或2都可能产生串AxA的形式,只要判断x,或者将AxA转化成AyA原创 2012-12-05 19:35:35 · 637 阅读 · 0 评论 -
ZOJ Monthly, November 2008
A 用tree树做,注意排序1~len-1再构造树B 类似的博弈,找出输的组合来计算下面能赢的组合C 求圆与环的相交面积,将环拆开成两圆分别求交做差即可,注意判断接近0时输出形势D 听说是宽搜,没有看E 动态规划计算每个出口的最优,o(n*n*n),注意s型的路径F把大数拆成3进制再从高到低逐位求和GHI附B:http://acm.zju.edu.cn/onlinejudge/showProbl原创 2012-12-05 19:34:44 · 368 阅读 · 0 评论 -
KMP串匹配算法
【转】http://hi.baidu.com/allen_jobs/blog/item/97a0e050f45a34591038c2fa.html如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段。 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法。KMP算法是拿来处理字符串匹配的。换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串原创 2012-12-05 19:34:10 · 277 阅读 · 0 评论 -
O(nlog(n))的最长上升(不下降)子序列算法
【转】http://blog.sina.com.cn/s/blog_4b1e4fe9010098af.html先回顾经典的O(n^2)的动态规划算法,设A[i]表示序列中的第i个数,F[i]表示从1到i这一段中以i结尾的最长上升子序列的长度,初始时设F[i] = 0(i = 1, 2, ..., len(A))。则有动态规划方程:F[i] = max{1, F[j] + 1} (j = 1, 2,原创 2012-12-05 19:34:08 · 380 阅读 · 0 评论 -
【转】关于并查集
poj 题目 1861 1182 (难) 1308下面是王建德的讲义: 如果:给出各个元素之间的联系,要求将这些元素分成几个集合,每个集合中的元素直接或间接有联系。在这类问题中主要涉及的是对集合的合并和查找,因此将这种集合称为并查集。 链表被普通用来计算并查集.表中的每个元素设两个指针:一个指向同一集合中的下一个元素;另一个指向表首元素。 链结构的并查集 采用链式存储结构,在进行集合查找时的算法复原创 2012-12-05 19:33:57 · 320 阅读 · 0 评论 -
时间优化的算法题
POJ2236 我在poj上2236测试了很多实例,显示:在输入输出上:用scanf,printf代替cin,cout可以大大加快时间,尤其对于输入、输出频繁的测试1014是一道动态规划的题目,但是可能超时,需要剪枝,搜索现在还是低级之低级,就不试了#include using namespace std;int a[60001],num[6],sum;bool dp(){ sum/=2原创 2012-12-05 19:33:55 · 608 阅读 · 0 评论 -
树形dp
Cell Phone Network/*树形DPd[i][0]为不取i并且以i为根节点的树都被覆盖需要的数目d[i][1]为取i并且以i为根节点的树都被覆盖需要的数目d[i][2]为不取i并且以i为根节点的树根结点i没有被覆盖,其他点都被覆盖需要的数目*/#include #include using namespace std;#define MAX 10000vector v[10005];i原创 2012-12-05 19:34:20 · 255 阅读 · 0 评论 -
稳定婚姻问题
It is commonly stated as: Given n men and n women, where each person has ranked all members of the opposite sex with a unique number between 1 and n in order of preference, marry the men and women off原创 2012-12-05 19:34:14 · 446 阅读 · 0 评论 -
大数相乘问题
当所给数相乘超过2^32次方时候,直接用乘法计算是得不到的。此时可以用整型数组来计算,其中数组中每个存一位。例如:a[20],b[20],c[40]存从低位到高位的数。a*b->c先将c初始化为0:for(j=0;j for(k=0;k for(i=0;i c[i+j]+=b[i]; } } for(i=0;i { c[i+1]+原创 2012-12-05 19:33:28 · 296 阅读 · 0 评论 -
带负号大数加减法简单程序
应一位网友要求写的个程序,如有朋友发现有错欢迎指出: #include #include using namespace std;#define LEN 30void sub(char str11[],char str22[],char str33[]);void removeZero(char str[]);bool smallThan(char str1[],char str2[]){原创 2012-12-05 19:36:05 · 633 阅读 · 0 评论 -
不含某个串的整数
给定一个整数,求在不包含某个小串的系列中该整数的位置http://acm.hust.edu.cn/thx/problem.php?cid=1025&pid=0此数为不含4、13的子串,求其现在的位置。注意输出:windows系统用I64d,linux用lld,教训个 十 百 千 ……开始个位取4,左边有1方法,右边n/10+(n%10>4?1:0),再十位,左边个位可以选择9种方法,乘以原创 2012-12-05 19:34:35 · 343 阅读 · 0 评论 -
成都网赛
第一题:http://acm.hdu.edu.cn/showproblem.php?pid=2428 和北大此题几乎一模一样 http://acm.pku.cn/JudgeOnline/problem?id=2002第三题:http://acm.hdu.edu.cn/showproblem.php?pid=2430记录某个余数最开始出现的位置,然后原创 2012-12-05 19:34:33 · 464 阅读 · 0 评论 -
08合肥网络预选
http://acm.pku.edu.cn/JudgeOnline/problem?id=3692求其补图再进行二分匹配#include #include using namespace std;#define N 210vector v[N];int g[N][N],q[N], pv[N], ma[N], mb[N];int match(int nva, int nvb) // nva:原创 2012-12-05 19:34:24 · 381 阅读 · 0 评论 -
poj之动态规划
1050 动态规划(化二维为一维)http://hi.baidu.com/newmyl/blog/item/c41a5f7f091dc80c29388a60.html1080 两串字符串求最大匹配度【做过居然还不会,需要反省】#include int score[5][5]={5,-1,-2,-1,-3,-1,5,-3,-2,-4,-2,-3,5,-2,-2,-1,-2,-2,5,-1,-3原创 2012-12-05 19:34:04 · 327 阅读 · 0 评论 -
质数、合数快速判断
我们平时用的判断质数、合数的方法: bool IsNotPrime(int t) { if(t%2==0) return true; int i; for(i=3;i*i if(t%i==0) return true;原创 2012-12-05 19:33:53 · 1570 阅读 · 0 评论 -
循环群问题
将n个数排好序成一环,然后每第m个数一下。要能恰好遍历所有的数的条件是 m与n互质2343原创 2012-12-05 19:33:41 · 603 阅读 · 0 评论 -
编程巧算最大公因数和最小公倍数
最大公因数和最小公倍数求法(common divisor and common multiple)欧几里德算法也就是辗转相除法,有着2000年的历史了。欧几里德算法依据的算法理论是一个定理:gcd(a,b) = gcd(b,a mod b)。common divisor: 最大公因数int gcd(int m, int n){ if(m { int tmp; tmp=m; m=n;原创 2012-12-05 19:33:36 · 1421 阅读 · 0 评论 -
【转】诸多需要掌握的算法
大牛给的计划——一般要做到50行以内的程序不用调试、100行以内的二分钟内调试成功.ACM主要是考算法的,主要时间是花在思考算法上,不是花在写程序与debug上。下面给个计划你练练:第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来. 1.最短路(Floyd、Dijstra,Bell原创 2012-12-05 19:33:32 · 294 阅读 · 0 评论 -
[转]NIM取石子游戏
取石子问题 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理。下面我们来分析一下要如何才能够取胜。 (一)巴什博奕(Bash Game):只有一堆n个物原创 2012-12-05 19:33:59 · 374 阅读 · 0 评论 -
并查集及模板
struct lset{int p[N],sz;void link(int x, int y) { if (x == y) return; if (x else p[x] = y;}void makeset(int n) { //初始化 sz = n; for (int i=1;i p[i] = i; }}int findset(int x) {原创 2012-12-05 19:34:06 · 301 阅读 · 0 评论 -
[转]三角形几个重要的点
/*==================================================*\| 三角形几个重要的点| INIT: pnt[]已按顺时针(或逆时针)排好序;| CALL: res = bcenter(pnt, n);\*==================================================*/设三角形的三条边为a, b, c,且不妨假设a原创 2012-12-05 19:34:01 · 543 阅读 · 0 评论 -
几种排序算法
原来在做数据结构课程设计的时候,分别对几种排序算法的“关键字的比较次数”、“记录的移动次数”做了具体的比较,结果显示在一般情况下快速排序最好、堆排序次之。表 几种常用排序算法性能比较原创 2012-12-05 19:33:39 · 348 阅读 · 0 评论 -
动态规划(DP)的例题:动态规划的几类问题
动态规划法所针对的问题有一个显著的特征,即它所对应的子问题树中的子问题呈现大量的重复。因此,动态规划的相应的特征是,对于重复出现的子问题,只在第一次遇到时加以求解,并把答案保存起来,让以后再遇到时直接引用,不必重新求解。 设计DP的步骤: 1> 分析最优解的性质,并刻画其结构特征 2> 递归地定义最优值原创 2012-12-05 19:33:34 · 631 阅读 · 0 评论 -
poj 3614 贪心解决最大匹配
http://acm.pku.edu.cn/JudgeOnline/problem?id=3614解题报告提示:We first sort the bottles by SPF rating and the cows by minSPF rating. We then scan the bottles in order and maintain a min-heap on the cows原创 2012-12-05 19:34:29 · 535 阅读 · 0 评论