![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
acm组假期作业
文章平均质量分 62
大工软院_野狐先生
这个作者很懒,什么都没留下…
展开
-
13-14寒假作业8
poj 1308 是不是一颗树? 输入几对数a,b,表示a点指向b点的一条边。判断这些边是否可以组成一颗树。输入两个零表示一组数据结束,输入两个-1表示程序结束。 首先如果是一个树,边数一定是节点数减一,所以首先判断这一点。但是这样还还不够,我们得保证这些边不成环。于是这里可应用到并查集。 然后每输入一条边,都用并查集判断这两个点是否在同一个集合里。如果他们在同一个集合里,就说明出现了环,原创 2014-03-03 21:09:01 · 472 阅读 · 0 评论 -
13-14寒假作业2
poj 1088 滑雪 简单的dp题,据说有人dfs过的,我没有尝试。 中文题,不发题意了。 dp的思路就是低到高进行一次递推,开始的每个高度都只需要一步就可以走到最下面。 用一个结构体数组,存每一个点的坐标和高度。 把这个数组按照高度从小到大排序。 从最小的开始,看看上下左右的点中比他大的点当前走几步可以走到最下边,如果当前点的步数+1比这个值大,就把这个值更新为当前点的步数+1。原创 2014-03-03 19:57:24 · 582 阅读 · 0 评论 -
13-14寒假作业13
poj 2352 一道线段树的题。。。刚刚弄懂线段树就做了这个题,真心有点捉急。。。好在最后还是想明白了~ 题目大意就是输入星星的位置坐标,这颗星星左下角有多少颗星星他就是等级几的星星,最后输出所有等级的星星个数。 因为输入的时候是按照从左到右从上到下的顺序,所以先输入的星星一定在后输入的星星下边或者左边。我们可以维护一颗根节点[0,N]的线段树, 每次不需要理会该星星的纵坐标,只需要从根原创 2014-03-04 18:52:49 · 493 阅读 · 0 评论 -
13-14寒假作业14
hdu 1166 敌兵布阵 中文题,不发题意。 以前对于一个数组,求某一区间的和,可以用前缀和很快的解决。但是如果这个数组的元素是随时变化的,那么前缀和就不能用了。我们可以用线段树来解决。 线段树是一颗二叉树,每个节点都是一个线段或者说一个区间。根节点是最大的那个线段,每个节点的左右儿子都是自己这条线段的左右两半,直到不能再分,就是叶子结点。 每当我们改变一个点的值,我们从根节点开始向下找原创 2014-03-04 19:18:28 · 500 阅读 · 0 评论 -
13-14寒假作业10
poj 1251 一道简单的最小生成树。kruskal算法过掉。 #include #include #include #include #include using namespace std; int n; int a[30][30]; int f[30]; struct xx { int a,b,n; }; int find(int x) {原创 2014-03-04 17:14:36 · 440 阅读 · 0 评论 -
13-14寒假作业11
poj 2349 有一些点,要求互相之间都能联系。有一定数目的卫星,每个卫星可以连接两个点,其余的点连接起来的消耗与连个点之间的距离有关。求最长的距离是多少。 其实也就是最小生成树,用kruskal算法,判断出前S(卫星数目)条可用最大边,表示这些边都用卫星来连接,剩下的最大的那个边权值就是我们求得值。 直接发代码吧~ #include #include #include #incl原创 2014-03-04 17:20:17 · 536 阅读 · 0 评论 -
13-14寒假作业9
poj2524 并查集水题 输入点的总数,在输入几对点,表示这两个点在同一组里,问总共有多少组。 并查集是很快判断这种题的一个办法,用到了一些树的思想。首先设一个数组f[i],表示第i个点的祖宗是谁,开始的时候每个人的祖宗都是自己。一个祖宗和它的后代们就是在同一个集合里的所有点。 每输入两个个数字,我们都找到他们的祖宗是谁,如果是同一个祖宗,说明他们是同一个集合的,否则令一个数的祖宗是另一个原创 2014-03-03 21:22:42 · 486 阅读 · 0 评论 -
13-14寒假作业3
poj 1050 输入一个矩阵,求出这个矩阵中数字之和最大的小矩阵的和是多少。 开始没有注意到数据量比较小,还以为是什么神算法。后来看到100*100的数据,于是暴力做过掉。 枚举小矩阵的宽度,对长度进行dp求最子字串就可以了。区间和用前缀和来记录,代码敲起来还有点讨厌- - #include #include int a[110][110],sum[110][110];原创 2014-03-03 20:05:10 · 466 阅读 · 0 评论 -
13-14寒假作业4
poj 1163 数字三角形 经典的简单dp!话说我的第一个dp就是这个,小白书上貌似用这个题举例子了。 题目大意: 输入一个数字的三角形,第一行一个数,第二行两个数,以此类推。。。问从第一行往下走到最下边所经过的路径和最大是多少,每次只能走左下一个或右下一个。 具体的做法就是从上到下,一行一行的遍历,如果对于一个点上边只有一个点可以走到它,那么就把它的值加上上面点的值,如过有两个点可以走原创 2014-03-03 20:16:47 · 528 阅读 · 0 评论 -
13-14寒假作业6
这个题真的不太会啊= =是看了别人的代码。。。感说得还比较好。。。我自己是dfs过了。 转载出处:http://blog.csdn.net/lyy289065406/article/details/6661449 下面是我的代码: #include #include int a[6],sum,i,ans,OK; void dfs(int step) { /* prin转载 2014-03-03 20:55:35 · 457 阅读 · 0 评论 -
13-14寒假作业5
poj 1836 简单的dp 一些军人排队,给了你一个数组,告诉你他们的身高,问最少踢出多少个人,可以保证整个队伍每个人都能至少看到他一边人?也就是中间的一个人最高,两边的人逐渐变矮就可以了。 具体做法就是从头到尾一个个枚举,假设当前的点就是最高点。在分别对两边进行dp求最大升序子序列并加起来,最大的那个值就是了。注意中间可能有两个一样高的人都是最高的,特判一下就好了~ #include原创 2014-03-03 20:26:14 · 472 阅读 · 0 评论 -
13-14寒假作业12
poj 1949 题目描述: 有一些任务需要完成。每个任务的完成需要一些时间,并且有的任务必须要其他一些任务完成后才能去做。求完成所有任务的最短时间。 其实两个任务是可以一起做的,不然把所有任务时间加起来不就好了吗。。。而且输入的时候按从前到后的顺序输入,所以输入的时候就可以进行dp。 当前任务完成时的最短时间等于它的前提任务中最晚完成的那个加完成他本身所需要的时间。最后找出其中最大的时间原创 2014-03-04 17:27:42 · 497 阅读 · 0 评论 -
13-14寒假作业15
poj 3624 完完全全就是一个01背包问题!!! 具体01背包网上到处讲解,不再赘述。 由于01背包在计算过程中只需要用到两行,当前计算行和上一行,所以dp数组可以这么开:dp[2][maxn]。还有就是用cin〉〉会超时。 #include #include int a[13000],N,M,w[3500],d[3500],dp[2][13000]; int max(in原创 2014-03-04 19:31:21 · 535 阅读 · 0 评论 -
13-14寒假作业7
poj 2479 也是一道dp的题,需要绕点弯子的最大字串和。 输入一串数字,从其中任选两个不相交的字串,要求他们的和最大,输出这个最大值。 先进行一次普通的求最长字串,不同的是dp不仅仅更新当前的值,还要更新这个值的起点终点。于是就需要一个结构体数组来记录(三个普通数组也可以的)。这个过程输入的时候就可以完成。 记录下最大字串的值,和起点终点分别为m1 l1 r1。然后原创 2014-03-03 20:50:51 · 492 阅读 · 0 评论 -
13-14寒假作业1
手敲快排之后懒惰了,没有手敲归并,假期的第一题就是手动实现了一下,ac了一个快排的题。 poj 2623 http://poj.org/problem?id=2623 题目大意就是输入一些数,输出他们的中位数。排序之后去中位数就可以了。 归并排序的思想网上挺容易找到的,不再赘述,直接发代码。 #include #include #include using namespace std原创 2014-03-03 19:40:14 · 546 阅读 · 1 评论