随笔分类 - 算法竞赛入门经典
摘要:题意加算法描述:先给出T个团体,并给出每个团体有多少人,每个人的编号,然后所有团体一起排队,排成一条大队列,排队的原则是,一个成员加入,如果这个成员所在的团体已经有人在排队了,那么他就加到他所在团体的最后面,而不是整个大队列的最后。如果整个大队列中没有他的团体,也就是他是他的那个团体第一个来的人,那么他就要排在整个大队列的最后(当然,他成为了他这个团体的第一人,以后他的队友来了就可以排他后面)出队则是按大队列的顺序,从第一名开始出队的,也就是说,按排在前面的团体的人按顺序逐一出完队后下一个团体的人才有可能出队本题在写的过程中运用了大量映射的思想,并且本题本身是个队列数据结构的题目,且用到了两个
阅读全文
摘要://此题其实不是考查矩阵乘法的问题,只是借这个背景来考查栈的运用,注意处理一些细节即可#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define MAX 30struct matrix{int r,c; char e;}a[MAX];int n;char s[10000010],stack[10000010];int cmp(struct matrix p ,struct matrix q){ return p.e<q.e; }int main
阅读全文
摘要://算法描述,构建一个双向循环链表,不需要不存放数据的头指针,按照prior指针遍历则认为是逆时针,按照next指针遍历则认为是顺时针//prior是逆时针,next是顺时针#include <stdio.h>#include <stdlib.h>#define LEN sizeof(struct node)int N,k,m;struct node{ int num; struct node *prior,*next;};void print_link(struct node *L){ struct node *p; p=L; printf("%d\n&qu
阅读全文
摘要://完全自己写的代码,用链表写的,很多细节没有修改,明天再改,时间是0.544//关键是find_3和find_1和swap函数的使用,注意细节,注意有的内存是一定要free释放//掉的,注意指针的使用,有的是把指针的值传递过去,有的是把指针变量本身的地址传递//过去,两者完全不同,注意看#include <stdio.h>#include <string.h>#include <stdlib.h>#define LEN1 sizeof(struct card)#define LEN2 sizeof(struct list)#define MAX 52 st
阅读全文
摘要:1. move a onto b在將a搬到b上之前,先將a和b上的積木放回原來的位置(例如:1就放回1的最開始位罝)2. move a over b在將a搬到b所在的那堆積木之上之前,先將a上的積木放回原來的位罝(b所在的那堆積木不動)3. pile a onto b將a本身和其上的積木一起放到b上,在搬之前b上方的積木放回原位4. pile a over b將a本身和其上的積木一起搬到到b所在的那堆積木之上//用链表实现,没有任何算法可言,完全就是模拟,感觉用数组来做代码能更短//由于用链表来做的原因,涉及到指针所以很多细节问题,实际上调试很久,指针的东西太久没写都忘记//了,以后要适当复习
阅读全文
摘要:很多次OJ都有 这题,其中poj 1933 , 题目的名字都是一样的题意:一个棋盘,横竖线都是从1到100标号(竖线从左到右标,横线从下到上标),输入n表示有n个被标记的格子,是给出这个格子的左下角坐标,然后输入m,在输入m个数,表示在这些竖线的地方切开棋盘(其实只切了m-2刀,因为2刀必须是1和100,相当于没有),然后输入A,表示你要在横上上切A刀(其实也只是A-2刀,因为2刀必须在横线的1和100)。那么就可以把棋盘很多个大小不一的方块(矩形),只要这些方块中有被标记的小格子(1个或多个),那么这个方块就是一个选区,我们是要使到选区的个数最多要先预处理,我们先来说明几个数组做意义。首先题
阅读全文
摘要:题意:给出一个矩阵的长和宽n,m,然后输入一些坐标,表示那个坐标上有垃圾(这道题里面每个坐标只有一个垃圾),然后机器人从(1,1)开始运动终点是(n,m)运动的方向只能是向下或者向右走,途中它要捡垃圾,目的是要令它捡的垃圾数最多,然后在能保证捡到的垃圾数最多的情况下,统计出有多少种方法,然后输出其中任意的一种方案。另外,这里面要给所有的格子编号,从第1行开始从左往右编号1,2,3……然后接着下一行,所以所有的编号分别是1,2,3……n*m。我们在输出任意的一种 方案时,是按照捡垃圾的顺序输出垃圾所在坐标的编号。另外怎么为之不同的方案,是指垃圾的编号不同,例如题中的例子<2, 4, 11,
阅读全文
摘要:题意:给出两个串a,b,去构建另一个串,新构建出来的串要满足两个性质。一,在这个新的串中选出一个子集是a串,另外选出一个子串是b,满足这个条件后,要求这个串的长度最短。也可以这样说,ab两个串合并为一个新串,不改变a,b串本身的相对位置,但是要求新串长度最短。输出这样的新串的个数所以基本上可以想到,是和LCS有关的,再细想,那就是算出LCS的长度,然后ab两串长度之和减去LCS的长度,相当于ab两串合并为一串,消去他们的共有元素,那么新串中还是包含了a,b串的所有元素还是可以选出一部分子集来得到a或b串的。但问题时,怎么构建,另外有多少种构建方法,实际上构建的方案数就是最后新串的个数我们可以模
阅读全文
摘要:这道题目在poj和zoj上都有,分别是poj 1093 zoj 1147题意:输入行宽,输入一篇文章,多行,多单词,然后以一个空行来表示文章的结束,但输入的行宽为0的时候表示程序结束。一个单词的长度不会超过行宽。然后通过调整使整片文章看起来最和谐,其实的要求是,一行中,如果不止一个单词,那么行首和行尾都必须放单词,即行首和行尾不能有空格。特殊情况是一行只放一个单词,那么这个单词一定要放在行首,另外如果这个单词的长度小于行宽,那么这一行的badness(一个数值)就为500,如果这个单词刚好等于行宽即完全放满,那么badness为0。另外badness原本是一个数值要计算的,即两个单词之间的空.
阅读全文
摘要:参考了别人的博客题意:先输入case数,每个case输入n,m,表示有n棵树,要用枪消灭m棵,下面n行给出n棵树的坐标,要求枪的个数最少。DP状态压缩。原理是对于n棵树我们搞一个n位的二进制数,如果第i棵树还没有被消灭,在n位二进制数对应的位上就是1,否则为0。例如有5棵树,若11111,说明5棵树都没有被消灭;10101,说明第2,4棵树已经被消灭了,然后这个二进数再转为十进制,这个十进制数就是一个状态。我们可以真的开辟一个数组b[]来对应保存那些0,1,然后转化为十进制,但是知道原理之后我们利用c语言的位运算直接对十进制操作。那我们要求的目标状态是什么?对于那个n位的二进制数,当1的个数小
阅读全文
摘要:题意给出一个n*n的方阵,从(1,1)出发到(n,n)目的是找出一条路径,这条路径上的点的值为负数的个数要小于等于k,在满足这个条件之下,使路径之和最大,如果无法找到这样的路径(即负数的个数一定大于k)则输出impossible定义状态为四维,f[i][j][k][v],表示从v方向来到当前的点(i,j),已经用掉的负数的个数是k,所能得到的最大值。V=0表示从上面递归而来的,接下来可以向下,左,右递归。V=1表示从左边递归而来,接下来可以向下,右递归。V=2表示从右边递归而来,接下来可以向下,左递归。然后就是注意初始化的问题和一些值要记得赋初值的问题,整个记忆所搜索的思路还是比较容易理解的#
阅读全文