算法设计
Jaster_wisdom
程序员
展开
-
HDU 1007
题目大意是这样的:在坐标轴上给定一些点,求出这些点中距离最近的两个点之间的距离。最后输出的结果是 距离的一半分析:只要将这些点按照横坐标从小到大排序,相同的话,按照纵坐标从小到大排序,求出每两点之间最小的距离len1; 然后按照纵坐标从小到大排序,相同的话,按照横坐标从小到大排序,求出每两点之间最小的距离len2; 最终的结果就是 min(l原创 2016-02-05 13:26:39 · 765 阅读 · 0 评论 -
HDU 1007 (分治递归)
之前做这题用了 讨巧的 方法,竟然也 accept 了,后来举出反例发现 那种解法有问题。正确解法:运用分治递归的思想,首先将 所有的点 按照x的大小顺序排好,相同的话,参照y的大小。 然后取中间的 一个点 作为分割线。这时,结果可能有三种情况,第一,最短的点对 在 分割线 左边;第二,最短点对 在 分割线 右边; 第三,最短点对 跨越了 分割线,一左一右。分别求出左边 和 右边原创 2016-02-07 14:33:40 · 712 阅读 · 0 评论 -
POJ 2479 (动态规划)
作为比较经典的算法思想,动态规划恐怕早已深入人心。今天在网上找了一个 题目来练练手。题目大意:给出一个 数字序列,求出最大的两个不连续子串之和 。 这道题 看似 就是 最大子序列和 的一个变种。本质都是用 DP 来解决。首先,将 a[i] 表示第 i 个元素,再建立 三个数组 tm[num],sm[num],stm[num]含义如下: tm[i] 表示 以第i个元素结尾的最大字原创 2016-02-09 22:28:18 · 1170 阅读 · 0 评论 -
POJ 2593
题目:求一个序列中最大的两段不连续子串之和。很明显,这道题是用动态规划 来解答,主要是 列出状态转移方程tm[i]代表第i个数结尾的最大子串sm[i]代表第i个数开头的最大子串stm[i]代表后面n-i+1个元素的最大值#includeusing namespace std;#define MAX 100001#define max(a,b) a>b?a:bint原创 2016-02-09 23:12:13 · 799 阅读 · 0 评论 -
POJ 1015
这道题应该来说,比较难,特别是变量的下标 有点多 且比较复杂。题目的意思是:给出n组数,每组数有一个P[i],D[i], 求出其中的m组,使得sum(P[i])-sum(D[i])绝对值最大,如果有多个这样的值,取其中sum(P[i])+sum(D[i])最大的一组分析:算法思想,动态规划用 V(i) 表示第i组的辩控差用S(i) 表示第i组的辩控和用f(j,k)原创 2016-02-12 14:39:48 · 556 阅读 · 0 评论 -
POJ 刷题顺序
POJ从简到难(按照AC数目排序)的列表如下,作为小弱的刷题顺序。大牛们可以看后面倒排的hard表,还有四道题没人拿到first blood.表格属性依次为:ID,Title, Ratio, AC, Submit1000 A+B Problem 0.55 188072 3389771004 Financial Management 0.41 58282 1403011003 Han转载 2016-03-01 20:51:50 · 2285 阅读 · 0 评论 -
POJ 1141
题目:定义合法的括号序列如下:1 空序列是一个合法的序列2 如果S是合法的序列,则(S)和[S]也是合法的序列3 如果A和B是合法的序列,则AB也是合法的序列例如:下面的都是合法的括号序列(), [], (()), ([]), ()[], ()[()]下面的都是非法的括号序列(, [, ), )(, ([)], ([(] 给定一个由'原创 2016-02-14 10:28:32 · 591 阅读 · 0 评论 -
POJ 1042
题意:John去钓鱼,在一个单向的很多条湖的路边钓鱼,每条湖每5分钟能钓到的鱼的数量随着时间减少,每条湖之间的行走时间也是不同的,但是固定不变。问的是,给出总的时间h小时,编写算法,求出能钓到最多的鱼的解决方案。输入:湖的数量,给定的总时间,每条湖头5分钟能钓到的数量,每条湖钓鱼的衰减速率,每两条湖之间的行走时间输出:每条湖上 钓鱼的时间,以及最大的钓鱼的数量分析:枚举算法原创 2016-02-14 22:09:52 · 518 阅读 · 0 评论 -
奇数变成最大的偶数
题目:给定一个奇数,交换两个数的位置,使它变成最大的偶数解析:将奇数的个位数 与 它之前的所有偶数比较,碰到比它小的数替换即可。 如果个位数比所有偶数都小,则把它与 最低位的偶数交换。#includeusing namespace std;void swap(int &a,int &b){ int tem原创 2016-02-01 20:42:09 · 1202 阅读 · 0 评论 -
POJ 1002
电话号码题,A了我一上午本题关键是 map 数据类型的运用,mp[s]++还有一点是 字符串的增加,只能写成 str += 的格式,我当初异想天开地以为 str = str + 也可以,后来发现太天真了。。最后注意,输出,当没有重复的时候,记得输出 No duplicates.#include#include#include#includeusing namespace s原创 2016-03-03 11:04:42 · 398 阅读 · 0 评论 -
POJ 1001
请注意,这道题并不像 看上去那么容易,至少我觉得,还是有点复杂的,毕竟大整数的计算还是有很多细节要注意。问题:计算一个在 0 ~ 100之内实数的n次方 (0拓展一下,大整数的计算有几点要注意:1.数据接收,存储(数组或者字符串)2.计算结果位数3.进位处理,借位处理4.商、余数求法这道题注意点:1.小数点的处理,以及反序2.进行n次乘法3.转载 2016-03-15 20:00:26 · 407 阅读 · 0 评论 -
POJ 1065
题目大意:给定一些木棍的数量,它们的长度以及重量,求出最少可以将这些木棍排成几列,每列的木棍的长度和重量呈非递减排列。分析:首先,将这些木棍 按它们的 长度从小到大排列,如果后面的len和weight都比cl,cw大的话,就将flag置为1,表示它已经排过了,并且更新cl,cw. 然后从头开始搜索,第一个flag为0,即没有安排的木棍,将它作为第二列的开始,直到将所有的木棍排完即可。原创 2016-03-03 16:38:31 · 516 阅读 · 0 评论 -
POJ 1251 (最小生成树)
很明显,这是一道 最小生成树的例子。也就是,从图中选取若干条边将所有顶点连接起来,并且所选取的这些边的权值之和最小。算法:Prim算法,或者 Kruskal算法Prim算法: 首先选择一个点为起点,然后找到与该边相邻权值最小的边,选中该边上的另一个点,然后选择 与选中点 相连接的最小边,这样循环下去,直到包含所有节点用d[i]表示 与 i 点相邻的最短边的权值,这点是与 Dijks原创 2016-03-16 10:30:17 · 979 阅读 · 0 评论 -
POJ 1005
这道题摆在OJ的前面,应该是水题没错。题目大意就是判断给定的点在第几年会被淹掉,已知的是,每年水会淹没50平方英里的面积。明显是一道计算题,第n年会淹到的半径为 根号(n*100)/PI , 这里注意的是 PI 可以预定义为3.1415926 ,精确一点也可以设为 acos(-1) 这里我为了避免开根号产生的 四舍五入的影响,干脆比较的是 半径的平方,即r_dou这题因为输出格式原创 2016-03-04 10:18:03 · 974 阅读 · 0 评论 -
POJ 1011 (经典搜索)
这道题 是 比较经典的 搜索题。题意:给出一堆小木棍的长度,需要把它们拼成几根相同的大棍子,求 这些大棍子的最短长度分析:这道题主要使用,深度搜索+递归,当然这里用到多次剪枝,这对于减小时间复杂度很有效。#include#includeusing namespace std;int stick[64];int used[64];int len;int n;bool原创 2016-02-17 22:35:12 · 1356 阅读 · 0 评论 -
POJ 1258
最小生成树,模板题,直接按照模板来 就可以了。注意:这里程序没有终止条件,就是一直是输入样例。#include using namespace std;#define MAXV 110#define MAX 100010int n;int map[MAXV][MAXV];int d[MAXV];bool vis[MAXV];void Prim(){ i原创 2016-03-16 20:40:59 · 468 阅读 · 0 评论 -
POJ 1521
这道题题目有点长,看了之后 发现时 哈夫曼编码问题,对给定对字符串中的每一个字母编码,使得整个编码序列最短。因为这道题最后只要求编码的长度,所以用优先队列就 可以解决。这里注意一下,优先队列的声明格式:/priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数://priority_queue//其中Type 为数据类型, Container 为保原创 2016-03-04 16:42:14 · 819 阅读 · 1 评论 -
POJ 1469
这是一道 二分图 求最大匹配边 最经典的例子,开始我竟没有看出来。。题目大意是,给定N名学生,P名课程,一名学生可以修任意门课程,要问的是能否在N名学生中找到P个人使他们满足两个条件:每个学生代表一门不同的课程,每门课程由一名学生代表。其实把这两句话 好好咀嚼一下,发现就是 二分图中最大匹配的问题。 匹配的概念是 每个顶点只能由一条边对应。当我们求出课程的最大匹配边数,其实就是求出了 co原创 2016-03-29 19:53:15 · 543 阅读 · 0 评论 -
POJ 1006 中国余数定理
这里题考查的 并不是 编程题,严格来说, 是一道数学题。主要考察中国余数定理。这里举一个典型的例子,就是,n % 3 = 2, n % 5 = 3, n % 7 = 2; 问n是多少?这道题枚举当然可以算出来,但是运用定理可以将复杂度降到O(1),它是怎么做到的呢?首先,我们求出5*7的倍数,并且它除以3余1; 同理,求出3*7的倍数,并且它除以5余1; 同理,求出3*5的倍原创 2016-03-05 20:05:33 · 634 阅读 · 0 评论 -
POJ 1789
题目我咋一看, 觉得有点新颖,后来 读题之后 发现又是 最小生成树的 例子。题目大意:每条字符串 都可以 由其他的字符串 演化出来。定义两个字符串之间的距离,就是它们之间不同的字符的个数。 要求的是, 如何演化,对应的距离之和 最短,相应的 倒数也就是 最大的。我们知道,最小生成树的权值之和是最短的。因为这道题,点的范围是 2~2000,并且构成的图 应该是 密集型的,每两个点之间 都会有原创 2016-03-17 16:59:42 · 384 阅读 · 0 评论 -
POJ 2485
最小生成树的例子。这次求的不是 最小生成树边的权值之和,而是构成最小生成树中 最长的边。不过,无论题目怎么变化,Prim算法的核心思想是 一样的,只要改变一下 最后输出的结果,找边的最大值即可。最后,说一下,这道题目的输出格式。本来没什么要求,可就是题目中说 每个样例 之后空一行,结果我cout#include using namespace std;#define MAXV 5原创 2016-03-17 19:06:53 · 483 阅读 · 0 评论 -
程序员互动联盟(第一届编程大赛第一题)
题目大意:将1到N的连续整数组成的集合划分成两个子集合,且保证每个集合的数字和是相等的。例如,输入N=3,对应的集合{1,2,3} 可以被划分为{3},{1,2}两个子集合,这两个子集合中元素分别的和是相等的。输入7,输出4思路:首先1,2,3……N所有元素的和为 S= N*(N+1)/2, 如果S不能被2整除,那么一定不能划分,否则各个集合里面的元素之和为 S = N*(原创 2016-03-30 16:00:05 · 952 阅读 · 0 评论 -
POJ 2446
题目大意:给定一个M*N大小的棋盘,其中的一些点是洞,无法放置卡片,卡片是占两个格子的矩形方块。现在用程序来判断 是否可以用卡片不重叠的 将整个棋盘填满?思路:看到这道题,压根刚开始没想起来用二分图,最大匹配来做。后来看了网上的博客,才有些思路。 首先要明确的是,在棋盘中,[i,j]表示的点如果i+j为偶数,那么周围的四个点的横纵坐标之和一定为奇数,反过来也一样。那么我们就可以原创 2016-03-30 20:00:07 · 524 阅读 · 0 评论 -
POJ 1007
这道题题目意思很好理解,就是求每个序列的measure值,怎么求?就是按题目的意思,将字符串里面的每个字母依次与后面的进行比较,遇到比它小的,count++最后输出就是一个排序,将count里面的值排序,同时要将它们的序号存进另一个数组b,毕竟最后有用的是 字符串对应的下标找到一个 最小值之后,将它的下标保存,然后将它的值赋为MAX,一个很大的数,保证下一次一定不会选上就行。这题虽然不原创 2016-03-07 19:56:43 · 377 阅读 · 0 评论 -
POJ 1088
看完该题,第一个想法是,找到 数组中 最大的数,然后在其周围找一个仅次于它大小的数,然后这样循环下去,不过这样好像比较麻烦。当某点上下左右四个点 都是一样大时,需要保留四个方向的值。后来采用 动态规划+递归,用len[i][j] 表示从(i,j)点开始的最大深度,动态转移方程: len[i][j] = max(len[i-1][j],len[i+1][j],len[i][j-1],len[i]原创 2016-03-19 10:24:14 · 687 阅读 · 0 评论 -
POJ 1087
这是一个 网络中的最大流问题的 经典问题。题目:有n个插座,m个电器,k种适配器(a,b),表示插座b可以替代插座a问最少有多少个 电器 充不到电?这道题 可以转换为 求最多可以多少个 电器设备可插入? maxflow那么问题的答案就是 m - maxflow下面就是 如何求最大流 maxflow. 增广路算法:每次用BFS找一条最短的增广路径,然后沿着这条路径原创 2016-03-20 10:30:30 · 663 阅读 · 0 评论 -
最大流问题 浅析
主要参考: 《算法导论》 引言 还是前几天参加的2014阿里巴巴春季校招(测试开发岗)笔试. 有道选择题: 图1中标出了每条有向公路最大流量,请问从S到T最大流量是( ). A.46 B. 47 C. 54 D.77 图1: 流网络看到这一题转载 2016-03-19 22:41:16 · 678 阅读 · 0 评论 -
POJ 1861
题目大意:某公司需要用线缆将网络中的结点连接起来,每两个结点之间有一个权值,选择若干条线缆,要求是任意两个点之间可达,并且要使最长的线缆最小。思路:本质上将就是一个最小生成树的例子,因为这里要输出最长的线缆长度,所以用Kruskal算法较为便捷。 Kruskal算法就是 不断地选择不构成环的最小的边。不构成环,这里用的是 并查集,看看两者是不是可达。 这里着重讲一下并查集。首先原创 2016-04-01 09:30:22 · 687 阅读 · 0 评论 -
Q-learning
通过一个简单而且好理解的数字例子来介绍Q-Learning的概念。这个例子描述了一个Agent是如何通过无监督训练(unsupervised training)来学习一个未知环境的。将下面的这个例子与之后的源代码的例子相比较会让你觉得很有帮助。假设在一个建筑物中我们有五个房间,这五个房间通过门相连接,如下图所示:将房间从0-4编号,外面可以认为是一个大房间,编号为5.注意到1、4房间和5是相通的。转载 2016-03-08 19:37:23 · 1196 阅读 · 0 评论 -
POJ 1459
最大流问题,EK算法#include #include #include using namespace std;#define MAX 1<<29;#define MAXV 105int map[MAXV][MAXV],pre[MAXV],vis[MAXV],n;int EK(){ int i,ans=0,now,min; queueq; while原创 2016-03-21 08:41:00 · 490 阅读 · 0 评论 -
最大流问题(EK算法模板)
最近在看 最大流问题,因为是第一次涉及到这种问题,以及第一次接触到这种类型的算法,所以刚开始一头雾水。首先,这种问题概念比较多,残存网络,增广路径,最小割,流量对称,等。 其次,虽然有现成的方法解决,但是解决此方法的算法有多种,优化的算法也有很多。刚开始看 Dinic 匈牙利算法,真心没看懂。。 现在我写了一份模板,是EK算法实现的。应该算最简单的一种实现方法了。我觉得,只要会熟练掌握原创 2016-03-21 08:58:57 · 1231 阅读 · 0 评论 -
POJ 2709
又是一道贪心算法的例子题目大意,我读了好久才读懂。 每套墨水组合都有50ml的液体,需要配置 要求的几种颜色,除了灰色以外的颜色需要三种颜色同时混合以外,其他颜色都有提供。思路:首先,看普通颜色需要最多的那一种 需要多少套。然后购买这些套,看看还剩余多少颜料可以配灰色。配灰色的话, 首先将剩余的颜料 从大到小 排列,取前三种配1ml灰色,直到灰色全部配完,如果不够的话,再购买一套颜料。原创 2016-03-09 11:44:18 · 768 阅读 · 0 评论 -
POJ 1308
题目大意就是判断是否为一棵树?成为一棵树的条件是:只有一个根节点、非根节点只有一个入度这里要注意的是,空树也是树,森林不是树,1 1 0 0 不是树,自己不能指向自己#include using namespace std;#define MAX 105int p[MAX];bool flag[MAX];int Find(int a){ //并查集,递归寻找根节点原创 2016-04-02 22:07:28 · 721 阅读 · 0 评论 -
POJ 1149
题目:m个猪圈,n个顾客,每个猪圈里面有一定数量的猪,每个顾客有一定的需求量。求最多可以卖出多少条猪?这里注意有一个前提条件,就是一个顾客开了一个猪圈之后,后 面的话,可以将这个猪圈里面的猪 拉到其他猪圈里去。此题关键就是 建立图结构,因为最大流问题,我们可以用 EK 模板来套。此图里面有三层,第一层就是源点,第二层顾客,第三层是汇点。总的来说,源点与顾客连,顾客与汇点连。注意原创 2016-03-21 20:14:07 · 562 阅读 · 0 评论 -
蒙特卡洛树算法 (MCTS)
实质上可以看成一种增强学习蒙特卡罗树搜索(MCTS)会逐渐的建立一颗不对称的树。可以分为四步并反复迭代:(1)选择从根节点,也就是要做决策的局面R出发向下选择一个最急迫需要被拓展的节点T;局面R是第一个被检查的节点,被检查的节点如果存在一个没有被评价过的招式m,那么被检查的节点在执行m后得到的新局面就是我们所需要展开的T;如果被检查的局面所有可行的招式已经都被评价过了,转载 2016-03-10 11:29:16 · 19680 阅读 · 0 评论 -
POJ 1033
这是一道关于磁盘管理的题目。题目大意:磁盘中有N块簇,F块文件,每个文件分别分布在不同的簇中。默认,顺序查找速度最快。问的是,怎么调整顺序使得各个文件按照簇的逻辑顺序排列。举例:假设原始顺序为: 初始状态是这样的,0表示未占用: 簇号: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17原创 2016-02-25 13:57:32 · 557 阅读 · 0 评论 -
POJ 2524 (并查集)
题目大意:已知一个学校有不同的种族,给定n个人,和m对人,每对人他们的信仰一样,问n个人有多少种信仰?前提是每个人只有一个信仰思路:如果a和b信仰相同,那么他们就属于同一集合。如果a和c相同,那么就把c加入到该集合中,很明显,属于同一集合里面的人信仰相同,那么问题就变成了求这n个人共有多少个集合。 首先,将n个人初始化为n个集合,发现a和b之间信仰相同并且它们之间不构成环的话,集合原创 2016-04-03 21:15:28 · 618 阅读 · 0 评论 -
POJ 1062
这次做的是 最短路问题。 运用 Dijkastra 算法: 将点集 分为两类,一边是访问过的,一边是 未访问的,该算法的终结条件是 所有的点 都访问过。 该算法解决某一点 到 图上 其他各点最短距离的问题。 那么,首先求出这一点到各个点上距离最小的一个点,将其加入到访问过的点集里面去,然后更新初始点到各点的距离,借助的就是刚刚进入vis[] 数组里面的那个点。举例来说的话,就是本来 甲地 到原创 2016-03-10 20:04:57 · 615 阅读 · 0 评论 -
第六届CCF计算机职业资格认证考试题解(1,2两水题)
201512-1 数位之和题目大意:输入一个数n,求出n的各个位数之和(每一位之和)#include using namespace std;int main(){ int n; cin>>n; int ans = 0; while(n!=0){ ans += n%10; n = n/10; } cout原创 2016-04-04 19:41:09 · 753 阅读 · 0 评论 -
第六届CCF计算机职业资格认证考试题解(第三题)
参加过两三次CCF考试,每次做到第三题,总是拿不到满分,总有情况遗漏掉,这道题我在考试时,得了90分,后来想了好久,没发现有什么情况遗漏掉了。今天再次做了一下,终于A了题目大意:根据输入的条件用‘-’、‘+’、‘|’,和给定的英文字母画一张图,给定m,n表示列数和行数。接下来给一个动作步骤数。动作共有两个形态,画线,开头用0表示,后面的四个数x,y,,u,v表示点(x,y)到(原创 2016-04-04 22:30:16 · 1427 阅读 · 0 评论