- 博客(56)
- 资源 (1)
- 收藏
- 关注
原创 rapidjson初探——使用C++解析json
刚开始想用jsoncpp的,发现这东西相当不友好,VS2013就是编译不了,于是就弃坑了发现rapidjson超级好用,只需要包含头文件,也就是可以跨平台虽然写很复杂的功能的时候可能需要自己封装一些接口,但是写简单的json解析完全够用了如果是有一个文件,里面有json格式的字符串那么只需要用文件流把这个字符串送到一个string里然后创建一个Document对象再把str
2016-05-01 15:43:33 14257
原创 PAT树 File Transfer——利用不相交集ADT求连通分图数目
题目描述:We have a network of computers and a list of bi-directional connections. Each of these connections allows a file transfer from one computer to another. Is it possible to send a file from any co
2015-11-21 11:28:31 777
原创 先序遍历,中序遍历,后序遍历中如何知道两者求整棵树
以知道后序遍历和中序遍历为例子If the postorder traversal sequence of a binary tree is FDEBGCA, and its inorder traversal sequence isFDBEACG, then its preorder traversal sequence is:ABDFECG首先看整个树,树的root在后序遍历中必然
2015-11-21 11:26:04 1556
转载 Matlab中的colormap详解
matlab中,每个figure都有(而且仅有)一个colormap,翻译过来就是色图。 COLORMAP(MAP) 用MAP矩阵映射当前图形的色图。 COLORMAP('default') 默认的设置是 JET. MAP = COLORMAP 获得当前色图矩阵. COLORMAP(AX,...) 应用色图到AX坐标对应的图形,而非当前图形。 colorm
2015-11-12 15:34:15 37803
原创 迭代法进行归并排序
以往使用的归并排序都是利用“分而治之”的思想递归进行,也就是不断二分到最小之后递归地归并上来然而,再引入一个数组就可以进行迭代法的归并排序把一个数组A里的先两两排序到另一个数组B里再把数组B里的数据四个四个排序到A里,以此类推代码如下:需要注意的是当j_end超过待排序总数N的时候需要把它置为N-1,不然就会下标越界#include #define ElementT
2015-11-09 22:36:10 2773
原创 同构树的判别
如果树B能够通过树A交换子树得到,那么称A与B是同构的和树有关的操作一般都可以通过递归来很清晰地实现递归中只要注意跳出递归的条件(永远都要注意空树的情况!)当A与B中至少有1个空树的时候,A与B就必须同为空树,不然就不是同构的如果A与B都不为空,但是A与B的Element不相等,那么也不同构剩下的情况递归判断即可,也就是A的左和B的右&&A的右和B的左同构 或者 A的左和
2015-11-09 21:37:23 3279
原创 双向队列的链表实现
定义以下这样一个队列结构:#include #include #define ElementType int#define ERROR 1e5typedef struct Node *PtrToNode;struct Node { ElementType Element; PtrToNode Next, Last;};typedef stru
2015-11-01 10:13:42 874
原创 二叉堆实现优先队列中的上滤和下滤
优先队列是使用二叉堆来实现其中很重要的两个操作,一个是插入,另一个是删除最优先值(这里认为是最小值)其中插入操作可以这样实现:把X放入二叉堆的最后端,然后再通过“上滤”操作把X放到相应位置删除操作可以这样实现:把最顶端的元素(即)最小值删除,然后把堆中最后一个元素先放到最顶端,然后通过“下滤”操作来使其到达正确位置代码如下:#include #include
2015-10-27 22:44:27 3127
原创 Matlab中的高斯卷积滤波矩阵
图像处理中很关键的一块就是提取图像的内容有一种方法就是根据颜色变化的剧烈程度来提取也就是对图像的像素点求偏导数,如果某个方向偏导数很大,一般来说就是不连续的,即轮廓线但是图像里往往会有很讨厌的噪声点如果不考虑这些点,直接对图像求梯度函数的话,就会收到很大的影响滤波矩阵就是为了一定程度上消除噪声,其中比较常见的是高斯卷积滤波矩阵在Matlab中是用fspecial('gaus
2015-10-24 22:12:24 12720
原创 PAT1067 Sort with Swap(0,*)
就是要用一种独特的排序方式来把数列排序这种排序方式是:只能交换0与其他的数最直接的想法当然是把0和它所在位置的应该是什么数交换,比如0在a[3],那么当然是找到3然后与0交换,这样3就换到了正确的位置如果0已经在a[0],那么就把它和数列中从左往右扫描的第一个没有在正确位置的数交换这个思路是很容易想到的,但是不优化的话就会超时一种比较简单的优化方法就是从左往右扫描,记下遇到的第
2015-10-21 17:20:17 429
原创 函数指针作为函数参数
先来看看普通的指针如果有 int a那么可以定义一个 int *p = &a则p是一个指向a的指针定义指针用一个比较粗浅的方法来说就是把原来的变量名换掉并且前面加星号,比如这里就是把a换成p并且前面加星号,就定义了一个可以指向a的指针同理,如果要定义一个指向函数的指针,那么也只要把函数名做类似的处理即可如定义一个函数 void MyFun(int x)那么只要定义 v
2015-10-14 09:32:43 7085
转载 matlab中的subplot函数
原文地址:http://blog.163.com/my_it_dream_pwj/blog/static/17841430520112294342649/ subplot 功能分割figure,创建子坐标系语法h = subplot(m,n,p) or subplot(mnp) subplot(m,n,p,'replace') subplot
2015-10-05 21:15:05 14454
原创 O(N^3)找最大子矩阵Submatrix
其实这个方法是从找最大子序列演化过来的找最大子序列的话,最直接的方法是确定左右边界,然后把这之间的加起来,与当前最大值比较,这样做法复杂度为O(N^3)稍微优化一下的话,是确定一边,然后一个一个加上去,每次与当前最大值比较,这样做法复杂度为O(N^2)再优化一下,就是从第一个开始加,每加一次之后与当前最大值比较,一旦和小于0,就把和清零,因为说明前面的那段对最大没有贡献,复杂度为O(N
2015-09-26 22:44:44 2385
转载 Matlab将散点绘制为平滑曲线的两种方法
自然状态下,用plot画的是折线,而不是平滑曲线。有两种方法可以画平滑曲线,第一种是拟合的方法,第二种是用spcrv,其实原理应该都一样就是插值。下面是源程序,大家可以根据需要自行选择,更改拟合的参数。clc,clear;a = 1:1:6; %横坐标b = [8.0 9.0 10.0 15.0 35.0 40.0]; %纵坐标plot(a, b, 'b'); %自然状态
2015-09-26 22:32:51 140777 7
原创 线性复杂度反转单向链表
假设这是需要反转的链表,那么基本思路就是每次都把大一些的一个放到头指针的后面即第一次把2放到1的前面,这个可以通过把1的next指向3,2的next指向1,再把头节点的next指向2这样就得到了head---2---1---3---4然后再把一下个大一点的数这样操作,即为把3放到头指针后面,把1的next指向4,把3的next指向2,把head的next指向3这些操作只需要利用一些
2015-09-24 20:29:02 1275
原创 HDU2.3.4 How Many Trees?
其实就是给定顶点数,求二叉树的数目可以这样想:先确定一个根,那么它的左子树为0个顶点时,右子树有n-1个顶点,并且还是二叉树,这就把问题的规模缩小了同理,左子树有1个顶点时,右子树有n-2个顶点所以假设f(n)为n个顶点对应的二叉树的数目,那么可以容易得到递推公式:f(n)=f(0)*f(n-1)+f(1)*f(n-2)+...+f(n-1)*f(0)这就是一个很露骨的卡特兰数
2015-09-08 21:06:51 420
原创 HDU2.3.3 Hat's Fibonacci
算是一道水题把(虽然我还是WA了很多次)还是高精度,但这次的数据范围有点大,都已经有两千多位数了,用每个单元放4位数字,貌似后来试了一下还是可以放得下,也是能AC的我刚开始怕不够,就用每个单元放8位数字,就是把高精度模板里的DLEN改成8 但是刚开始忘了把相应的MAXN改成99999999,所以WA了每个单元存放8位数字,用a[256]就足够了,然后因为最多2005位,则最大的数也
2015-09-08 20:25:41 486
原创 cout的格式控制——关于cout.width()和cout.fill()
今天做C++的高精度的时候发现高精度的模板输出使用到了cout.width()和cout.fill()以便把每个单元存放的四位数字输出于是就去查找了一下关于cout.width()和cout.fill()的相关信息关于cout.width():a、控制符int width()将用来调整字段的宽度,因为width是成员函数,所以要通过对象来调用,比如cout.width()将显示当前
2015-09-08 16:16:47 32729 1
原创 HDU2.3.1 A + B Problem II
依旧是用大数模板,但是我很作死的自己改了一下模板,把输出大数里的“cout结果就WA了三次,然后用9999与1检查发现只输出了10而不是10000,但是让它输出长度的话还是2是没有错的,只是后面那4个0只输出了一个然后回过头去检查才发现cout还是很强大的,因为用了cout.width(4)与cout.fill('0')使程序能够保证就算原来某个单元(最后一个单元除外)里存的如果不到4位也
2015-09-08 16:00:44 492
原创 HDU2.2.8 Big Number
感觉自己脑子还是太僵了,上一题是大卡特兰数,用到了高精度,这题看到又是大数阶乘,所以想都没想就套了高精度模板,然后自己写了一个输出数字位数的函数,这里还要注意大数模板里的len是指高精度里的数组的程度,但是数组的每个单元最多是可以存放四个数字的,所以最后的那个单元要特殊考虑。但是后来Runtime Error(ACCESS_VIOLATION)了很多次以后才发现n的范围是给到了10的7次方,那
2015-09-08 11:20:27 484
原创 HDU2.2.7 Train Problem II
就是一个卡特兰数的问题,而且出题者比较坏,数据给的很大,所以必须用C++的高精度,或者直接用JAVA自带的BigInteger类型,但由于自己用不来java,所以只好用高精度了。关于卡特兰数,有以下递推:令h(0)=1,h(1)=1,catalan数满足递推式:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)例如:h(2
2015-09-07 22:50:28 625
转载 C++重载运算符相关
原作地址:http://blog.csdn.net/dingyuanpu/article/details/5852825看到觉得很有用就先转载过来,如原作者反对,请联系我,我会立即删除,谢谢 C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作。例如: class complex { public: compl
2015-09-07 20:08:54 528
转载 C++默认参数注意事项
原作地址:http://blog.csdn.net/weiwenhp/article/details/8481026看到了觉得很有用就转载了如果原作者觉得侵权请联系我,我会立即删除,谢谢 默认参数在函数参数较多时是非常有用的.可以只传必须的值,其它取默认值.使用方法如下: 1.默认参数是严格按照从左至右的顺序使用所以只有如下使用才是合法的(1)参数全部为默认值
2015-09-07 19:55:52 854
原创 HDU1022 Train Problem I
是一道很露骨的模拟栈的题目,但是由于第一次做到,还是卡了一下的。就是用一个stack来模拟,让进栈的序列逐个进栈,然后再每次都判断一下是否与当前出栈序列的位置符合,如果不符合就继续进栈,如果符合就出栈,弄清楚各个的标记即可。因为如果当前的栈顶符合出栈序列的当前位置却不出栈的话,它一定会在接下来入栈的车的后面出栈,就不可能符合给定的出栈顺序。然而题目的数据好弱,后来才发现我都忘了用题目中
2015-08-30 20:59:13 585
原创 HDU2.2.6 Digital Roots
刚开始想复杂了,掉进坑里了,而且还用了 这个库来用stream的方法将int类型转化为string类型,但是我总算明白了为什么当年书上叫我们慎用stream了,这速度真是慢的感人,直接让我TLE了这个方法应该是可行的,就是时间方面不允许,这种方法的代码如下:#include #include #include using namespace std;std::strings
2015-08-29 22:25:09 366
原创 HDU2.2.5 三角形
这题刚开始觉得好难,在纸上画画感觉没什么规律,后来才发现只要写出前四个就可以找出规律了这个就是需要画图画的细致一点,尤其是四个三角形的时候一个三角形是2、两个三角形是8、三个三角形是20、四个三角形是38它们之间的差是6、12、18 都是6的倍数于是就想到了a[i]=a[i-1]+6*(i-1)后来在网上也看到了另一种解释,虽然也没有证明(也可以看成是找规律吧),就是每种情
2015-08-29 20:58:06 571
原创 HDU2.2.4 Wolf and Rabbit
和之前有一题一样,那题是很多人坐成一个圈,然后每隔几个人报数,原理相同,即为m与n互质即可全部遍历。代码如下:#include #include using namespace std;unsigned long gcd(unsigned long a,unsigned long b){ if(a<b){ unsigned long temp=a; a=
2015-08-19 23:11:56 444
原创 HDU2.2.3 汉诺塔VII
这道题卡了我好几天,不过最后还是想出来了,我用的是迭代的方法,效率上要比网上查到的递归DFS要高一些,但是却不如那种方法直观。现在我把两种方法都放上来好了。基本思路都是一样的:先自己在草稿纸上画画汉诺塔的移动方法,然后再找规律。我们可以发现,对于N个盘子,最开始是在A柱上,然后之前离散课上分析所需步骤数的时候是转化成较小的子问题,即把N-1个盘子通过某种方法移动到B柱上,然后再把第N个
2015-08-19 22:21:18 651
原创 HDU2.2.2 Joseph
刚开始没有去考虑复杂度,直接很单纯地模拟,然后果然超时了···但是一看到这么少的数据种类(k只有1到13),那么直接打表就好,打表的话妈妈再也不怕我超时了~还是提一句,所谓打表就是提前把所有可能的情况都存在一个数组里,然后根据输入直接输出相应数组中的数即可。其实打表就是把原来会超时的代码利用本地运行来节省时间,单纯拿出结果。这虽然有点流氓,但是还是很实用的一种方法,打表的代码和
2015-08-10 22:13:14 750
原创 HDU2.2.1 Fibonacci
这年头数学真的太重要了···第一次遇到这么大的斐波那契数列,用数组递推肯定会被卡掉的后来网上看了看别人的解题报告才想起来斐波那契数列是有递推公式的递推公式的话自行百度好了,这里打起来很麻烦···关键其实还是如何取大数的前四位,其实之前遇到过的那题取N^N的第一位的题是差不多的,但是由于那题没有搞得很清楚,导致这题也卡主了,以后再也不这样了···其实就是如果我们要求一个数的前4位,比
2015-08-09 16:32:25 693
原创 HDU2.1.8 小数化分数2
分成三种情况来讨论:(1)只有普通小数(2)只有循环小数(3)前面是普通小数,后面跟着循环小数把普通小数的位数num和循环小数位数(即为括号中的数字个数)cir_num统计出来对于情况(1),就是把小数表示的数字除以对应的10的次方,比如0.32对应32/(10^2)对于情况(2),就是把小数表示的数字除以对应的10的次方减1,比如0.(32)对应32/(10^2-1)
2015-08-08 18:13:45 1359
原创 HDU2.1.7 Leftmost Digit
看到这么大的数据,本来第一反应是高精度,但是感觉10亿的10亿次还是会爆的,于是又想了很久,但是实在想不出,于是只好去其他博客里看看解答。看完了解答真是忍不住拍手喝彩,这就是数学境界的差距。假设M=N^N,那么题目就是要求M的第一位数字,两边求log(10为底数),于是log(10)M=Nlog(10)N,于是M=10^(Nlog(10)N),由于10的整数次方必然是1000···0,最高
2015-08-08 17:20:58 593
原创 HDU2.1.6 The area
又是一道数学题而且刚开始一时疏忽竟然把抛物线方程设成了y=-(x-x1)^2+y1,连a都忘记设了,后来检查时才发现,后面的就很简单了,把抛物线和直线都表示出来然后算一下定积分即可。代码如下:#include #include #include #include using namespace std;double f(double x,double k,double b,
2015-08-08 09:10:33 551
原创 HDU2.1.5 找新朋友
刚开始就想着每个数都和N判断一下gcd是否为1即可,但是这样显然会超时。然后又想到了打表,但是感觉这题没必要打表···然后就用了判断其因子,然后把每个因子对应的flag都标记一下即可代码如下:#include #include #include #include using namespace std;bool flag[32768];int main(){ i
2015-08-08 08:42:39 565
原创 HDU2.1.4 Cake
直觉就是这题会有公式,然后和别人一起讨论了很久之后毫无进展后来只好参考了一下别人博客里的想法终于恍然大悟就是把一个圆,在圆周上画点将其等分,想分成p等份需要画p个点想分成q等份需要画q个点并且如果都是从同一个起点开始画,那么会有gcd(p,q)个点是重合的于是公式就是p+q-gcd(p,q)代码如下:#include #include using namespa
2015-08-07 22:01:59 592
原创 HDU2.1.3 相遇周期
为什么感觉是题目出错了···我刚开始的做法是根据所给数据求出两个卫星的各自周期T1和T2然后再用T1*T2/abs(T2-T1)即可但是这样求出来和样例拍不上上网查了一下,(虽然我并不明白原理),是要把原来的分数先化为最简,然后求分子的最小公倍数作为分子,以及分母的最大公约数作为分母,再把它们约分到最简单即可得到结果,但是我仍然认为自己最初的做法是对的···用这个所谓的能AC的
2015-08-07 21:15:57 1142 3
原创 HDU2.1.2 How many prime numbers
就是判断质数,因为数据范围比较小,所以直接用最普通的判断方法即可,也就是枚举比其平方根小的数看看是不是它的因子。如果数据范围很大的话可以用素数的线性筛法,以后应该会碰到。代码如下:#include #include #include #include using namespace std;bool isprime(int x){ for(int i=2;i<=sqrt
2015-08-07 10:13:34 480
原创 HDU2.1.1 最小公倍数
求两个数a,b的最小公倍数的方法:先求出a与b的最大公约数c,然后再用a与b的乘积除以c即可得到最小公倍数最小公倍数则用欧几里得算法即可代码如下:#include #include #include using namespace std;int gcd(int a,int b){ if(a<b){ int temp=a; a=b; b=temp; }
2015-08-07 10:03:29 600
原创 HDU1.3.8 As Easy As A+B
就是排序,输出格式有点蛋疼,必须是每个数之间都有空格,但是最后一个数后不能有空格代码如下:#include #include #include #include using namespace std;int a[1001];int main(){ int T; cin>>T; while(T--){ int N; scanf("%d",&N); for
2015-08-07 10:00:42 413
原创 HDU1.3.7 Crixalis's Equipment
最开始没想清楚,就直接根据物品的B来排序,想着把B大的物体先放入,但是WA了后来自己想了一个例子,比如V有11,然后物品1是10 11,物品2是1 1,此时要先放1但是当物品1是10 10,物品2是1 3时,要先放物品2于是想到了根据B与A的差来排序,因为当B与A相同时肯定是放在最后放的,因为不需要去“照顾”这种类型的物品B与A差值越大的越需要先放还有一种比较科学的分析
2015-08-06 14:43:10 464
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人