ACM总结报告 ACM总结报告 算法设计 姓名:杨加勇学号:20143617专业:计算机2班指导老师:费玉奎 说是报告,其实更算是个总结,这学期这门选修课所学知识的一个大致总结。还是开始选择这门课时所说的,并无后悔或者惋惜一说,算法或许在以后一点也用不到,这个只是或许一直荒废,我不考研,也不去参加什么竞赛,工作也只是将关于计算机的作为一个过渡,我只
总结四 这个专题讲的是图论。首先是图的存储方法,一个是利用二维数组的邻接矩阵的方式,但限制是点不能很多的,边可以稠密的图。另一个是邻接表,标准的应该是用指针式的链表存储,为了方便和运行速度,修改成结构体的数组来存储,运行速度要快,而且更加方便,它的限制就是边不要太多,点数可以很多的图。然后就是并查集的算法,也可以算式个简单的算法,但主要的还是为了为下面的问题铺垫。一个是最小生成树问题,有2个算法,一个是p
1005 题目编号:1005题目大意: 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。解题思路:典型的并查集算法,根据并查集的模版就能算出来,不是很难的题。做题感想:坚持就是胜利!
1010 题目编号;1010题目大意:一个人回家,从办公室穿过一个森林,森令有很多路,要求每次走到一个新的节点他离家的距离更近,求他可以走的路的条数。解题思路:这题不是很简单,根据题意可以分析是分两阶段来求解的问题。首先用dijkstra算法求出最短的距离,然后根据搜索里面的方法求出路的条数。一开始还是和以前一样,结构体,排序等等,不过这次的算法是讲优先队列的元素加入,由于是排序好的,所以取的路的距
1004 题目编号:1004题目大意:给出任意两城市之间距离,求最小生成树。解题思路:看题目也知道是水题了,直接套模版并查集的函数。先创建结构体然后排序,如果没有联系的两个城市,则加入距离,并入集合。最后把输出结果。感想:奋斗,做做水题凑凑数。#include#include#includeusing namespace std;int map[101][101];int mark[1
1006 题目编号:1006题目大意:一个人维护道路,但是因为费用的缘故,所以只能维护部分的。求用最小的费用来维护道路,使这些道路把所有的城市连通。解题思路:不错,和前面的差不多,很是典型的求最小生成树,与并查集的算法结合来求解。还是前面那一套,结构体,排序,合并,求值。还用 的Kruskal算法。感想:没啥好说的啦。。。#include#includeusing namespace s
1016 题目编号:1016题目大意:有N个城市,有道路连通,权值是安全系数,给出此人所在城市和想去的城市,然后求一条安全系数最小的路。解题思路:找最小的路用的floyd算法,但有区别,因为这个这个是权值相乘,不是相加,需要改变,输出方式也需要保留,最好是用C语言输出。做题感想:没啥想说的。。。。赶紧结束吧#include #include #include #define N 10
1002 题目编号:1002题目大意:简单的说,就是把用权值和最小的边把若干点连起来。解题思路:这是一到很典型的并查集和最小生成树的题目。我比较喜欢KRUSKAL算法来做最小生成树的题。首先创建个结构体,里面是2个点。然后一个函数,求这2个点之间的距离,也就是权值,然后重载运算符,排序为按照权值从大到小。而后就是几个固定的函数了,合并集合的函数,求父节点的函数,初始化节点的函数。然后根据题意输入数据
1001 题目编号:1001题目大意:有N给村庄,利用二维数组给出相对村庄的距离的权值,求最小生成的最小权值。解题思路:算是个水题吧,根据老师上课讲的kuskal模版很容易套用求解。kuskal算法是按边权值大小求最小生成树,比较简单。很固定的算法,创建结构体,然后比较函数来排序利用函数。首先初始化,创建数组来存储距离的权值,按照上课模版套用算法,然后输出结果即可。解题感想:坚持到一半以上就OK
1023 题目编号:1023题目大意:也一群人在一个体育馆找位置,体育馆座位有300且环绕成一个圈。给出若干两个人的距离,表示B在A的顺时针开始的距离值。求给出的若干关系不正确的个数,也就是后来的座位与前面的有冲突。解题思路:这个题目是典型的并查集问题,只是对比以前的模版有点区别,这道题的解题关键也就在合并的函数上了。首先输入,然后进入函数,假设是A和B两个人。合并A,B时,假设A,B属于不同的树,
1008 题目编号:1008题目大意:给一个带权值的图,求权值最大的连通子图,要求最多里面有1个环存在。解题思路:这道题考的是并查集,但在基础之上有所添加点难度。首先,两个独立的集合,要想合并,先看对方是否有环存在,如果都有环,那么就不能合并,如果只有1个有或者都没有,可以合并了就。基于此,大体框架是有了,代码就好写了。代码有3个数组,一个表示下标为i时的集合,一个标记此下标下的集合是否存在环,一个
1011 题目编号:1011题目大意:一个人先去一个相邻的城市坐车,然后去自己想去的若干地方,这地方有几个是相通的路,求需要的去某个地方的最短的时间。解题思路:这道题很复杂,我一开始套最小生成树的思路然后再加上变化,也没弄出来。我看到了老师的解题代码,于是根据老师的思路树梳理一遍。首先需要一个结构体数组,数组的值的内容是此标号到下个标号值,相距的时间和此相同标号到下个不同标号的结构体指针。一开始初始
1009 题目编号:1009题目大意:给定编号从1到N的路,求通过的最短时间。解题思路:根据题意,每两个街道之间应该最多是一条路,否则时间会不同,那就没有意义了。我选择用二维数组来表示图。首先,初始化,把所有的路全设为无穷大,然后再根据题目添加道路的权,也就是时间。后面,也就是解题的关键,找到从1到N的最短时间。我用一个函数来实现的。首先创建2个数组,1个表示从1开始到N的最短时间,另一个1起到标记
1003 题目编号:1003题目大意:某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不 一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?解题思路:题目大意说直白点就是求可以最少多少条线把子连通图连起来使其成为一个大的连通图。这道题用并查集的方法将每个子连通图表
总结三 感觉好快,一下子又到了总结的时候了,这个栏目的主题是动态规划,顾名思义,难点在规划上。老师一开始从最长上升子序列入手开始讲解,中间是各种类型的改头换面的动态规划,最后是背包问题收尾。总的感觉,难,难在想不到,难在抽象上。首先,需要对数组有充分的认识,当听完动态规划,我当时就懵了,原来数组可以这样子用!把一个数组的维数分解开来,这维表示一个元素,那维表示另一个元素,当然与传统的用法是不一样的,这
1008 题目编号:1008题目大意:给你一个二维数组,从左上角走到右下角,每个格子里面有唯一的值,有正数有负数,每次只能向下移动一格或者向右一格或者向右移动到行所在列的i倍列,求最大和解题思路:这个题目的解决也是根据背包的套路来的,当然因为里面有新颖的走法,所以需要根据不同的情况来描述问题。首先创建2个数组,一个存地图,一个存和。这里有几个细节需要说一下,为了循环需要,在1-N和1-M里面的地图来
1007 题目编号:1007题目大意:有一个数组0-10,一个人站在5的位置上,它一秒移动一个单位,给定N组数据,表示第i秒有1个馅饼掉落在j位置上,求他能接到的最多的馅饼的数量。解题思路:这是个典型的动态规划问题。如何解决呢,我们一个想到背包问题,如何套用里面的思路看看能不能求解。其实如果仔细做这道题,你会发现就是个背包问题,只是换汤不换药,而且加了点难度罢了。首先创建一个数组,二维的,第一个下标
1023 题目编号:1023题目大意:一个人要报考大学,需要交纳一定的费用。现在给定一定的费用和N所大学报考所需费用和录取几率,求至少收到一份大学offer的概率。解题思路:首先要考虑的是,至少收到一份的概率,那么很简单想到一份都收不到的概率,然后用1去减就OK了,所以主要是求得一份offer都收不到的概率,所以在输入每个学校的入选概率时,数组存储的是没有选中的概率,然后这个问题就可以套01背包的形
1001 题目编号:1001题目大意:给定几个数,让你从头开始加,到某个数是加到前面还是独立出来有两个选择,求最大的和。解题思路:根据题目的要求,必须有3个形参,一个是最大的和,一个是起始位置,一个是结束位置,而解题的关键就在于如何比较取舍这最大的和。首先一个循环,然后输入数据,里面开始判断是不是第一个数据,如果是就初始化上述的3个形参;如果不是,判断一下暂时储存的和对于目前的输入的数的符号,假如目
1002 题目编号:1002题目大意:给定2个字符段,求它们最长的公共字符数。解题思路:这题的解题方法类似于课上讲的最长上升子序列问题,都是用数组来存储答案。首先,利用2个string类型的形参输入,然后求他们的长度,保存起来。创建一个足 够大的数组,每组数组操作之前清0先,然后一个双重循环,外面是第一个字符串的长度,里面的第二个字符串长度,最里面是个条件语句,如果第一个字符串的字符和第