
数据结构
PMYCQACF
coding是为了更好的未来
展开
-
动态规划入门(五)
今天,我们初步接触背包问题,主要针对于背包中的完全背包和01背包的原理及拓展进行讲述。1.01背包 01背包指在一个有n件物品,一个容积为m的背包这样一个情况下,使能装下的物品价值最高。(w[i]表示重量,c[i]表示价值) 拿到这一题,首先想是否满足于DP的原理(因为求最优值),那么一看,先列出一个阶段n,表示前n件物品,状态j表示装的物品总容积为j,那么可设:f[i][j]——表示前i件物品原创 2017-04-30 17:21:58 · 682 阅读 · 0 评论 -
【洛谷】P1626象棋比赛
题目描述有N个人要参加国际象棋比赛,该比赛要进行K场对弈。每个人最多参加两场对弈,最少参加零场对弈。每个人都有一个与其他人不相同的等级(用一个正整数来表示)。在对弈中,等级高的人必须用黑色的棋子,等级低的人必须用白色的棋子。每个人最多只能用一次黑色的棋子和一次白色的棋子。为增加比赛的可观度,观众希望K场对弈中双方的等级差的总和最小。比如有7个选手,他们的等级分别是30,17,26,41,19,38,原创 2017-08-02 23:01:28 · 1337 阅读 · 1 评论 -
二叉排序树浅讲
二叉排序树是一种树形结构,这种树有如下几种性质若左子树不空,则左子树所有节点值均小于其根节点值若右子树不空,则右子树所有节点值均大于其根节点值其左右子树也分别是二叉排序树 有了这些性质,我们便可以证明出二叉排序树的中序遍历必然有序: 下图是一个普通的二叉排序树: 那么二叉排序树就可以在OI的道路上有所应用,当然以一些小牛的本领,自然只能够使用其排序,毕竟这只是二叉排序树浅讲……所以我原创 2017-07-26 15:02:36 · 491 阅读 · 0 评论 -
二叉平衡树(AVL树)
在了解AVL树前,需要具备以下两点只知识:普通二叉树 2. 二叉排序树这时,我们可以进入到平衡树的学习中了,但在学习之前,有一个问题,何为平衡树?很多的参考书中说到,平衡树就是每一个节点的平衡因子的值只能为0,±1。那么平衡因子又是什么?平衡因子,是左右子树节点个数的差。(这样就容易理解了吧!(⊙﹏⊙)) 这里涉及到了平衡树的插入操作,那么该如何对于每一个插入的数进行操作处理呢?这里的分类讨论原创 2017-07-28 15:19:41 · 595 阅读 · 2 评论 -
拓扑(TOP)排序
今天要讲的是图论之中一个很重要的东西,叫做拓扑排序,又称top排序(下文中使用这个简称),但是我们得先介绍一下AOV网。 如果有想了解官方学术语言的,戳这里。这里,为了方便,我们使用一些简洁的定义,即用顶点表示活动,用边表示活动的先后顺序的有向图。 拓扑排序,是指在AOV网中,把所有的点按照它们的逻辑关系排成一个线性的序列,是每个点的前驱都排在它前面,称之为top序列。方法如下:选择一个入度为原创 2017-08-15 16:08:00 · 2882 阅读 · 0 评论 -
『洛谷T7835』士兵站队问题
题目描述有N名士兵(1<=N<=26),编号依次为A,B,C,……进行队列训练时,指挥官要把一些士兵从高到矮依次排成一行,但现在指挥官不能直接获得每个士兵的身高信息,只能获得“P1比P2高”这样的比较结果(P1,P2∈{A,B,…Z},记为P1>P2),如“A>B”表示A比B高。编一程序,根据所得到的比较结果求出符合条件的排队方案。注:比较结果中没有涉及到的士兵不参加排队。例如,设有3个士兵,A、B原创 2017-08-15 21:21:07 · 1108 阅读 · 0 评论 -
关节点及重连通图
这个内容为什么想放在这个时候就放出来呢?因为刚刚才把TOP排序讲完,所以我们跳过关键路径『有什么关联吗?』,直接进入关节点和重联通图。 一、关节点:又称割点,是维系一个图能够连通的节点(就是说没有这个节点,这个图就不连通),若从连通图中删除点V,就会使这个图割裂成多个子图,则称V点为该图的关节点。 二、重连通图:没有关节点的图。【补充:其充分必要条件为任意两点都在一个圈上!】以上是这两个重点的概原创 2017-08-22 23:50:48 · 3439 阅读 · 0 评论 -
【洛谷】P1540 机器翻译
原题这道题目就是一道十分简单的模拟(这还用说?)#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<algorithm>using namespace std;int flag[1010],a[1010];int main(){ int i,j,k,n,m,ans=0,del原创 2017-09-10 11:59:25 · 887 阅读 · 0 评论 -
【洛谷】P1525 关押罪犯
原题题目描述S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件。每年年末,警察局会将本年内监狱中的所有原创 2017-09-13 22:24:37 · 436 阅读 · 0 评论 -
后缀表达式转中缀表达式
这个专题很迷,因为这种东西很少使用,一般都是中缀转后缀(容易计算),但是有一些bt的题目总是喜欢这样倒着出题,所以适当的了解还是有必要的。题目描述给出按后缀表示法输入的一个算术表达式,表达式中只有26个大写英文字母和加减乘除四个运算符号,表达式的长度<=50,表达式以#号结束。请你编程求出它的等价中缀表达式。输入输出格式输入格式:输入文件只有一行,就是后缀表达式。输出格式:输出文件只有一行,就是原创 2017-08-24 09:16:38 · 559 阅读 · 0 评论 -
【洛谷】P1440 求区间最小值
传送门这道题目一眼看去,先想到的必然是暴力,但是数据范围m≤n≤2000000m≤n≤2000000太吓人,所以放弃这个想法,那么我们一步步分析样例是如何得来的:/*6 27 8 1 4 3 2077113*/因为第一个数前面没有数,输出0第二个数之前的最小数为7,输出7第三个数之前2个的最小数为7,输出7第四个数之前2个的最小数为1,输出1第五个数之前2个的最小数为1,输原创 2017-08-29 23:31:19 · 554 阅读 · 0 评论 -
【洛谷】P1582倒水
原题题目描述一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水。接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子。每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃。(不能丢弃有水的瓶子)显然在某些情况下CC无法达到目标,比如N=3,K=1。此时CC会重新买一些新的瓶子(新瓶子容量无限,开始时有1升水),以到达目标。现在CC想知道,最少原创 2017-09-16 15:51:08 · 471 阅读 · 0 评论 -
9.16考试【广东省选】
作为一只蒟蒻,站在了一大堆大佬之中,所以对于本次考试我没有丝毫的信心,但是我依旧打算来一发题解报告本次考试有四道题目,都是广东省选的老题目,当然有的很水,有的很难,我们按照先易后难的顺序来发表。T4象棋比赛原创 2017-09-16 15:42:01 · 333 阅读 · 0 评论 -
树形DP入门(一)『ツリーとしては』
这次我们谈论的是树形DP,它是一种神奇的动态规划,它的模型建立在树上,所以称之为树形DP。树形DP的成立性:树是一种奇妙的结构,它一定满足最优子结构和无后效性(因为它是树啊!他的状态一定会由它的子树的来[或者说它一定会从它的父节点得来])。树形DP实现的方法:递归!!!因为它是一棵树,所以对应的有两种方式:从根到叶子结点:对应线性结构的从前往后。从叶子结点到根:对应线性结构的从后往前所以采用递原创 2017-09-01 13:09:25 · 353 阅读 · 0 评论 -
[HDU]1520 Anniversary party
这道题目其实就是一个裸的树形DP,和洛谷P1352 没有上司的舞会一模一样,只是要加一个读入判断罢了[英文不好导致错了3回,每次都是Wrong Answer,就是没有加这个判断!!!]#include<bits/stdc++.h>using namespace std;int dp[6010][2],fa[6010],v[6010],n;void tree_dp(int i){ in原创 2017-09-01 23:12:33 · 353 阅读 · 0 评论 -
Splay伸展树
百度百科现在我还是一个小蒟蒻,所以有关代码解释的,以后再说,你就只要知道有这个操作就好……具体请见yybdalao的博客原创 2017-10-18 22:38:09 · 488 阅读 · 1 评论 -
堆
堆是一棵完全二叉树,何为完全二叉树?参见。 有了这个定义,我们就可以将堆分成两种,一个叫小根堆,另一个叫大根堆,顾名思义,小根堆就是堆最小,大根堆就是根最大。 堆的性质:堆具有所有完全二叉树的性质堆的左右子树也是一个堆。 这里我们引入一个例题:【模板】堆,这一道题目就是一道裸题,很容易想到使用堆,那么堆有什么基本操作?#include<bits/stdc++.h>using names原创 2017-07-18 17:07:03 · 358 阅读 · 0 评论 -
并查集(题解)
这里是练习并查集的一些题目和代码: 1.POJ1611#include<iostream>#include<stdio.h>#include<stdlib.h>using namespace std;int f[100010];int gi(){ char c=getchar();int f=1,sum=0; while((c>'9' || c<'0') && c!='-原创 2017-07-30 16:11:30 · 349 阅读 · 0 评论 -
综合——3.25
1、三值排序 排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌序的时候。在这个任务中可能的值只有三种1,2 和3。我们用交换的方法把他排成升序的。 写一个程序计算出,给定的一个1,2,3 组成的数字序列,排成升序所需的最少交换次数。 样例 输入 9 2 2 1 3 3 3 2 3 1 输出 4#inclu原创 2017-03-25 16:06:20 · 646 阅读 · 1 评论 -
合并果子,浅谈堆
合并果子是一道经典的贪心,但是如果一味的快拍,那么: (n-1)*log(n)*n的复杂度不卡才怪,这个时候,我们就要请出二叉树中的堆。 堆,是一棵完全二叉树,如果你想要插入或删除一个元素,并保持顺序,时间复杂度是log(n)的。所以,我们就邀请堆来解决。#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h原创 2017-03-01 22:19:24 · 1083 阅读 · 0 评论 -
树的概念
tree,是一種神奇的數據結構,它的比例關係是1:n的,我最喜歡的樹莫過於Bt樹了,話不多說,還是來看看例題吧! 本题参考信息学奥赛一本通(第三版),鸣谢编写组首先,我們一定不會忘記最初的一個簡單的水題,它是給入門級選手所準備的。找樹根和孩子,這裡,我們不用建樹,因為太過於複雜,對於這一題還不必要。詳情看註解#include<stdio.h>#include<stdlib.h>#include原创 2017-02-08 16:43:35 · 662 阅读 · 0 评论 -
中缀表达式求值
#include<stdio.h>#include<stdlib.h>#include<cstring>using namespace std;char s[100001],c[100001],zhan[100001];int top,lenc,calc[100001];int bj(char a,char b){ if(a=='+') if(b=='+' ||原创 2017-02-07 22:58:04 · 524 阅读 · 0 评论 -
计算
话说,小明也是够无聊的啊! 普通的中缀已经不能满足小明了,于是,他添加了一个^,(开方运算^_^,谢谢表情!)好厉害的样子啊!但是依旧难不倒我们的OIER,正如游戏所说,你这么厉害,还会错吗?#include<stdio.h>#include<stdlib.h>#include<cstring>using namespace std;char s[1000001],c[1000001],z原创 2017-02-07 23:40:05 · 338 阅读 · 0 评论 -
oil 分油
其实很简单,一个BFS就过 先放题目:【 问题描述】设有大小不等的3 个无刻度的油桶, 分别能盛满 X、 Y、 Z(都小于等于 100)升油, 初始时第一个油桶盛满, 另外两个为空。 现在, 要想在某一瓶中分出 T升油。 分油时可把一个桶里的油倒入另外的桶中, 或者将桶中的油倒空。 设计一种以最少步骤的分油方案。【 输入】以文件方式输入数据, 格式为:第一行: X Y Z {设第一个原创 2016-10-15 11:51:36 · 969 阅读 · 0 评论 -
约瑟夫问题
这是一道广为流传的问题,描述我就不说了。#include <iostream>using namespace std;int main(){ int m,n; cin>>n>>m; int a[n+1],j=n,k=1,p=0; for(int i=1;i<n;i++) //建立链表 a[i]=i+1; a[n]=1; while原创 2016-10-12 20:32:19 · 273 阅读 · 0 评论 -
7.31_day2
7.31_day2原创 2016-07-31 08:25:33 · 412 阅读 · 0 评论 -
期末1.0比赛
信息编程原创 2016-07-30 15:41:39 · 398 阅读 · 1 评论 -
数据结构(1)——栈
一、栈的定义:栈是只能在某一端插入或删除的特殊线性表。 二、基本操作:进栈(PUSH)算法退栈(POP)算法三、例题: 1.例1:括号的匹配 分析:看到这一题,我们明显想到的,应该是统计左右括号的个数,然后判断,所以代码就出来了。#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>char s[原创 2017-07-03 16:46:09 · 452 阅读 · 0 评论 -
树的遍历
今天主要是讲二叉树的遍历,所以会看上去比较短。遍历,指对树的一种输出方法,树的遍历主要分为一下几种:先序遍历中序遍历后序遍历层次遍历叶节点遍历我们今天讨论的问题就是:已知先序遍历和中序遍历。求后序遍历。这看上去是一道难题,但实际上很简单。我们主要将思想:先序遍历与中序遍历有什么区别?很明显,我们就可以通过这个区别,找到建树方式,最后再实现后序遍历。建树是这个程序最重要的阶段,我也不好一语道原创 2017-02-10 22:26:59 · 429 阅读 · 0 评论 -
数据结构(二)——队列
一、队列定义:队列是限定在一端进行插入,另一端进行删除特殊线性表。二、队列基本操作:入队出队三、队列例题: 1.例1:舞伴配对问题: 分析:这一题是一道经典的取模运算,每一次将编号往前加一位,到达n就取模。#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>int main(){ int原创 2017-07-05 09:16:46 · 455 阅读 · 0 评论 -
树状数组
树状数组是一个神奇的东西,它比线段树的代码更加简洁而有效。 1.基本概念——参见百度 2.基本操作: (1):lowbit(极为有趣):设节点编号为x,那么这个节点管辖的区间为2^k(其中k为x二进制末尾0的个数)个元素。因为这个区间最后一个元素必然为Ax, 所以很明显:Cn = A(n – 2^k + 1) + … + An 有了这个结论,我们就可以通过二进制来编写一段管辖范围的代码:i原创 2017-07-05 11:43:35 · 266 阅读 · 0 评论 -
树的遍历专讲(知二求一)
今天,我们将对树形结构中知二求一的问题模型展开探究,但不包括不知道中序遍历。1.先序中序求后序。 给大家一组样例: 入: ABCD BADC 出: BDCA 大家可以仔细分析,得出这样一个结论,先找先序的第一个,然后第二个,第三个……一个个的加入树,最终输出,所以程序就出来了#include<stdio.h>#include<stdlib.h原创 2017-04-26 21:43:33 · 1273 阅读 · 0 评论 -
并查集初步
我們在已經了解了樹的情況下,現在來學習并查集。 如果你不了解樹,請觀看這篇博客和下面這個 并查集是什麼?并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的元素所在的集合合并。通俗的說,就是讓每一個元素都有一個自己的最高領導!就好像一群武林高手啊! 大家原创 2017-03-18 16:24:51 · 782 阅读 · 0 评论 -
[洛谷]P1311 选择客栈
原题首先暴力如果写的优秀,可以拿到60分,这里介绍两种暴力:40:#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#include<algorithm>using namespace std;int color[200010],cost[200010];int main(){ int i原创 2017-10-15 10:28:51 · 468 阅读 · 0 评论