
c++
文章平均质量分 71
gzxcyy
这个作者很懒,什么都没留下…
展开
-
codeforces好题记录——2B
题目见http://codeforces.com/problemset/problem/2/B给定一个正方形数组,只能向下或向右移动,求从左上移动到右下,在这个路径上的所有数字的乘积末尾的0最少。考虑到要使乘积末尾有0,则路径上必须有10,或者有2和5,有几个10末尾就有几个0这里是一个求最优的问题,考虑用dp来做,要求就是路径上2和5的个数中的最小值最小!!!但是这样直接dp原创 2014-03-15 21:05:14 · 881 阅读 · 0 评论 -
【PAT Advanced Level】1025. PAT Ranking (25)
简单模拟题。#include #include #include #include #include using namespace std;struct stu{ string reg; int score; int final_rank; int location_num; int local_rank; stu(string r, int s, int ln,原创 2013-11-07 21:24:37 · 865 阅读 · 0 评论 -
【PAT Advanced Level】1024. Palindromic Number (25)
回文数#include #include #include #include #include #include #include #include using namespace std; string Reverse(string a) { string ans; for(int i = 0; i < a.size(); ++i)原创 2013-11-07 20:18:57 · 875 阅读 · 0 评论 -
【PAT Advanced Level】1022. Digital Library (30)
这题其他没什么,就是输入输出比较麻烦,还怪自己太不熟练。#include #include #include #include #include #include using namespace std;struct book{ string id; string title; string author; vector keywords; string pub原创 2013-11-07 18:51:09 · 1118 阅读 · 0 评论 -
【PAT Advanced Level】1021. Deepest Root (25)
这题分两个步骤:1. 求出图中有几个连通子图2. 如果只有一个连通图,找出最长的路径(图的直径)我直接用了一个DFS求连通子图的个数,其实更通用的方法是并查集。找出最长路径,我们进行了n次DFS,每次以一个节点作为根节点。后来看了网上的解法,其实只需要两次DFS就可以求得。昨天我刚刚看了怎么求树的直径,今天该用到的时候又忘了,真是学的不牢啊。具体求法见http://blog.c原创 2013-11-06 15:19:43 · 818 阅读 · 0 评论 -
【PAT Advanced Level】1020. Tree Traversals (25)
这题给定后序和中序遍历的结点顺序,要求层序遍历的结点顺序。可以通过后序和中序构造出这棵树,然后再BFS给出层序遍历。构造的规则为:1. 找到后序遍历的最后一个元素,这个元素肯定是整个树的根。2. 根据上面找到的元素,将中序遍历的序列分为两边,左边肯定是根的左子树,右边是根的右子树3. 递归左子树和右子树#include #include #include #inclu原创 2013-11-06 12:58:30 · 866 阅读 · 0 评论 -
算法导论22.2-6 好选手、坏选手
//算法导论22.2-6题 “好选手、差选手”//题意就是要判断一个图是否是二分图//二分图又称双分图、二部图、偶图,指顶点可以分成两个不相交的集使得在同一个集内的顶点不相邻(没有共同边)的图。//二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(U,V),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同原创 2013-11-05 14:06:18 · 1569 阅读 · 0 评论 -
求树的“直径”以及所想到的
算法导论22.2-7题:树T=(V,E)的直径(diameter)定义为max(u,v),亦即,树的直径是树中所有最短路径长度中的最大值。试写出计算树的直径的有效算法,并分析算法的运行时间。如果这里的树T是简单的二叉树或者多叉树,我们可以用递归来解决(Diameter(tree T)表示T的直径);1. 求出T左子树的最深节点的深度Dleft,求出T右子树最深节点的深度Dright。2原创 2013-11-05 14:59:07 · 2363 阅读 · 0 评论 -
【PAT Advanced Level】1019. General Palindromic Number (20)
这题就是简单的模拟题,为了确保不越界,我使用了long long要注意加入0的判断!#include #include #include using namespace std;int main(){ long long a, b; cin>>a>>b; if(a == 0) { cout<<"Yes"<<endl<<0<<endl; return 0;原创 2013-11-04 21:56:36 · 872 阅读 · 0 评论 -
【PAT Advanced Level】1018. Public Bike Management (30)
这题还是比较有难度的。题目中要纪录的东西比较多,比较繁琐。这题我考虑先用Dijkstra算法计算单源最短路径,在计算过程中纪录每个点的最短路径的前序(如果最短路径有多条,每个前序都需要纪录),然后再递归深搜出具有最少携带自行车数量的路径。这题还有几个点没过,先放着吧,感觉整体思路没什么问题。#include #include #include #include #inclu原创 2013-11-04 21:55:08 · 1047 阅读 · 0 评论 -
【PAT Advanced Level】1017. Queueing at Bank (25)
先排序,然后模拟事件。简单的模拟题。#include #include #include using namespace std;const int opened = 8 * 60 * 60;const int closed = 17 * 60 * 60;struct customer{ int hour; int minute; int second; int原创 2013-11-03 15:25:37 · 1050 阅读 · 1 评论 -
【PAT Advanced Level】1016. Phone Bills (25)
注意细心,简单模拟题。#include#include#include#include#include#includeusing namespace std;const int HOURS=24;const int NAME=21;typedef struct Record{ char name[NAME]; int mou; int dd; int hh; i原创 2013-11-02 22:06:17 · 825 阅读 · 0 评论 -
【PAT Advanced Level】1068. Find More Coins (30)
最近在学习动态规划,PAT中的这一题就是一个典型的dp问题。这一题和01背包问题很类似,M相当于背包问题中的背包容量,硬币面值相当于每件物品的重量,背包问题中要求物品价值最大,这里要求物品总重(面值和)等于M,从可选方案中选择最优的是根据给定的比较方法。我们解决问题的难点:如何选择出最小的序列?首先来看递归式:L(i, j)表示在前i号硬币中选择,并且总价值小于等于j的序列的最大面值和原创 2013-11-01 19:53:17 · 1949 阅读 · 1 评论 -
【PAT Advanced Level】1023. Have Fun with Numbers (20)
#include #include #include #include #include #include #include #include using namespace std; void GetCntTable(string a, vector& cntTable) { cntTable.assign(10, 0); for(int i原创 2013-11-07 20:17:51 · 885 阅读 · 0 评论 -
【PAT Advanced Level】1031. Hello World for U (20)
简单题,算算就可以了。#include #include using namespace std;int main(){ string s; cin>>s; int n1, n2; n2 = (s.size() % 2 == 1)?3 : 4; while (n2 <= s.size()) { n1 = (s.size() - n2)/2 + 1; if(n1原创 2013-11-10 16:17:41 · 931 阅读 · 0 评论 -
返回连续子序列,使得和最大(变形)
编程珠玑上一道老题:一个数组,找出连续子序列使得和最大。我们可以使用线性扫描的算法来解决,这道题变形之后成为:找出连续子序列,使得和最接近某个数。原来的时间复杂度为线性的方法行不通了,我们可以累加数组,然后排序,求的相邻的差,最接近k的数就是所求。代码如下:int approximate(int * pArry, int len) { int * cum = 0原创 2014-03-15 21:06:31 · 1065 阅读 · 0 评论 -
左旋字符串——编程珠玑和STL所想到的
在看编程珠玑时候有这么一题:将一个长为n的字符串左旋i位,例如abcdefg左旋3位得到:defgabc在书上提到了两种解法,分别如下,习题中有这么一个问题:i和n的最大公约数如何才能被程序用到?一时间没有思路,看看STL是怎么实现的,果然用到了最大公约数。最后就介绍STL中的rotate算法。法一:从a[0]开始,每隔i位,将后面的元素移到前面去,将a[i]移到a[0],a[2*原创 2014-03-15 21:06:06 · 1008 阅读 · 0 评论 -
codeforces好题记录——3D
题目见http://codeforces.com/problemset/problem/3/D给定一个字符串,里面有'?'和'(', ')'。我们需要替换‘?’为左括号或者右括号,使得整个串的左右括号正好匹配。如果单纯是上面的要求,就可以用一个stack来做,遇到成对的就出栈。但是题目有其他的要求:给定每一个问号替换成左括号和右括号所需的代价,求所有的替换方案中总代价最小的那一个。原创 2014-03-15 21:05:33 · 1022 阅读 · 0 评论 -
codeforces好题记录——4D
题目见http://codeforces.com/problemset/problem/4/D这道题是LIS(longgest increasing string)的一个变种版本。对于LIS问题,我倒是很快能写出答案,但是如果加上一些限制条件,写起来就有点难度了。我们常用的做法是简单的dp,时间复杂度是O(n^2),如果想要达到O(nlogn),就要在选择最大长度上做一些优化。如下:原创 2014-03-15 21:05:48 · 1034 阅读 · 0 评论 -
有关const的一些知识点
const可以在运行时初始化,也可以在编译时初始化。cosnt int i = get_size() //运行时初始化const int i = 4 //编译时初始化,编译器会在用到i的地方进行替换默认情况下,const只在文件内有效。如果确实需要在文件间共享,可以使用extern关键字(不管是定义或者声明都需要添加)。const作用到引用上,则该引用不能修改被引用的值。初始化对原创 2014-03-12 10:06:48 · 802 阅读 · 0 评论 -
STL的榨汁机——type traits
STL中关于类型提取器的详细介绍,我再此就不赘述了,只是记下其中关键部分,供我以后学习之用。nested type,这种方法能获得一个类的associated type,如下代码中,想要获得myIter类的T类型,可以在此类中nested一个typedef,将T保存下来,其他类中,就可以使用typename I::value_type来获得I类中nested进去的type(typena原创 2014-03-12 10:05:27 · 1079 阅读 · 0 评论 -
trivial和non-trivial在构造析构中的作用
triavial通常是指没有意义,在构造类对象的时候,有时候编译器会自动生成构造函数(拷贝构造以及=号运算符号),有时候这些函数对于用户来说是没有意义的(尤其是在类里边有动态分配的指针时)。但在以下4种情况下,缺省的构造函数是有意义的:1.类里边有其他类变量(该类有缺省构造函数)2.类是从另外一个类继承而来(基类有缺省构造函数)3.类里边有虚函数。4.虚继承的情况。//原创 2014-03-12 10:06:22 · 2767 阅读 · 0 评论 -
trivial、standard layout和POD的比较
POD的含义可以从两个显著的特性说明:它支持静态初始化,而且在C++中编译POD类型会和C中编译的struct类型得到相同的内存布局正是因为这个,这个定义被划分为两个不同的概念:trivial 类型和standard-layout 类型,因为这比POD类型更有用。新标准中已经很少使用POD这个术语了,而是更多的在使用更精确的概念:trival和stand-layout。 POD s原创 2014-03-11 13:38:31 · 2118 阅读 · 1 评论 -
【PAT Advanced Level】1033. To Fill or Not to Fill (25)
网上策略说的很详细了,利用贪心算法:假设我们现在在A点,A能到达的最远距离之内有B, C, D三个点:1. 如果B, C, D中有比A小的,则找到离A最近的,A加的油刚好够到这个点;2. 如果没有比A小的,A加满油,到B\C\D中最小的一个点停下来,再加油。代码注意细节:当第一个点距离不是0时,车子哪里都去不了!#include #include #include #原创 2013-11-10 16:26:15 · 1079 阅读 · 0 评论 -
【PAT Advanced Level】1029. Median (25)
#include #include #include #include using namespace std;vector v1;vector v2;int main(){ int a, b; long tmp; scanf("%d", &a); int i = 0; while (i < a) { scanf("%ld", &tmp); v1.push_原创 2013-11-10 16:14:07 · 924 阅读 · 0 评论 -
【PAT Advanced Level】1030. Travel Plan (30)
先用Djikstra算出最短路径,纪录下相同的最短路径,再回溯计算花费最少的路径。其实不用回溯,直接在比较最短路径的时候比较花费最少就可以了。#include #include #include #include using namespace std;struct node{ int index; int curDist; vector preCity; nod原创 2013-11-10 16:16:24 · 1003 阅读 · 0 评论 -
【PAT Advanced Level】1032. Sharing (25)
这题如果用C++标准库里的string的话,会超时,还是用int或者char数组来保存吧。先遍历一遍,每个节点打上标记,再换一个头,遍历第二遍,如果碰到标记,就是所求。#include #include #include using namespace std;struct node{ char s; int next; bool flag; node(char s原创 2013-11-10 16:20:33 · 892 阅读 · 0 评论 -
【PAT Advanced Level】1015. Reversible Primes (20)
转换进制&&逆序可以在一起进行,有一点技巧,不要用十进制数来表示低进制,容易溢出。#include #include using namespace std;bool isPrime(int n){ if(n < 2) return false; if(n == 2) return true; if(n % 2 == 0) return false; for(原创 2013-10-31 20:06:02 · 795 阅读 · 0 评论 -
【PAT Advanced Level】1014. Waiting in Line (30)
简单模拟题,注意读懂题意就行#include #include using namespace std;#define CUSTOMER_MAX 1000+1#define INF 0x6fffffff #ifndef LOCAL// #define LOCAL#endif LOCALint n; // number of windows <=20int m ;/原创 2013-10-31 19:22:26 · 769 阅读 · 0 评论 -
【PAT Advanced Level】1003. Emergency (25)
利用深度优先搜索获得最短路径以及最多的支援。看到有人是先用Dijstra算法获得最短路径,再用DFS求得最短路径的条数,这个以后再实现原创 2013-09-29 15:52:23 · 852 阅读 · 0 评论 -
【PAT Advanced Level】1006. Sign In and Sign Out (25)
关键在于清空字符数组和使用scanf进行输入#include #include #include #include using namespace std;int main(){ int num; while (scanf("%d", &num) != EOF) { char earlest[20]; char lastest[20]; char原创 2013-10-12 22:06:52 · 864 阅读 · 0 评论 -
【PAT Advanced Level】1002. A+B for Polynomials (25)
思路:先将两个多项式存入到两个数组中,再利用归并排序的方法合并两个多项式。注意:遇到相加后系数为0的项要舍弃,项的数目也不能+1。改进:写到一半发现项的指数给定了范围[0...1000],那么可以使用间址技巧,将项的指数看成数组的下标,这样扫描一遍就可以得到结果。#include #include #include #include using namespace std;原创 2013-09-29 15:44:03 · 767 阅读 · 0 评论 -
栈和队列面试题总结
1. 在O(1)时间内实现栈的push、pop、min操作分析:push和pop操作都很好做到,但是min操作就没这么容易了,首先想到的肯定是设置一个flag在每次push的时候纪录下最小值,但是考虑一下如果pop的时候正好pop掉了最小值怎么办呢?解决:使用两个stack,一个存放数据,另一个存放每次push后的最小值,这样当pop数据的时候,若是正好是最小值,则将stack2也pop掉原创 2013-10-13 19:56:17 · 1164 阅读 · 0 评论 -
用数组实现一个简单的heap(最大堆)结构
make_heap函数用来从给定的任意顺序的数组创建一个最大堆。push_heap函数向堆中压入一个新的数据,并维持堆的形态。pop_heap函数取出堆中最大的元素,并将该元素从堆结构中剔除,维持堆的形态。使用了定长数组作为基本的存储数据的结构,当数组空间满时,重新申请一个两倍长于当前数组的新数组,将元素复制过去。heap.cppclass heap{priva原创 2013-09-28 20:11:49 · 3393 阅读 · 0 评论 -
面试题
http://blog.youkuaiyun.com/v_july_v/article/details/6015165#comments转载 2013-10-13 18:52:07 · 545 阅读 · 0 评论 -
cout格式化输出
//在使用setf等库函数时使用//在使用流操纵算子时使用//using namespace std;//以下所有的setf()都有对应的unsetf()用于取消设置//所有的setiosflags()可以用resetiosflags()取消//标志位fmtflags的命名空间可以使用ios_base::或者ios::int laneri = 12345;dou原创 2013-09-26 20:21:41 · 954 阅读 · 0 评论 -
C/C++误区四:char c = getchar();
许多初学者都习惯用 char 型变量接收 getchar、getc,fgetc 等函数的返回值,其实这么做是不对的,并且隐含着足以致命的错误。getchar 等函数的返回值类型都是 int 型,当这些函数读取出错或者读完文件后,会返回 EOF。EOF 是一个宏,标准规定它的值必须是一个 int 型的负数常量。通常编译器都会把 EOF 定义为 -1。问题就出在这里,使用 char 型变量原创 2013-09-26 14:47:05 · 1612 阅读 · 0 评论 -
C/C++ strtok函数
一、头文件:#include 二、函数原型:char * strtok (char *str, const char * delimiters);三、参数:str,待分割的c风格的字符串(c-string);delimiters,分割符字符串。四、说明:将字符串str分解成若干个单词,单词之间以delimi原创 2013-09-26 14:38:25 · 679 阅读 · 0 评论 -
线性时间排序之——基数排序
我们知道,传统的比较排序法的时间复杂度是有下界的,最快也不会快于O(nlgn),比较排序顾名思义就是通过元素间的相互比较大小,完成排序,例如快速排序、堆排序、插入排序等等。而非比较排序法则可以做到在线性时间内排序。为了介绍基数排序,我们先来介绍一种特例——计数排序。计数排序为了实现线性时间排序,是需要条件的:我们需要知道待排序数据的范围。计数排序对输入的数据有附加的限制条件:原创 2013-10-11 15:39:59 · 969 阅读 · 0 评论 -
算法总结:判断一个数是否为素数
1.约定x%y为x取模y,即x除以y所得的余数,当x象都为整数。x^y表示x的y次方。乘方运算的优先级高于乘除和取模,加减的优先级最低。见到x^y/z这样,就先算乘方,再算除法。A/B,称为A除以B,也称为B除A。若A%B=0,即称为A可以被B整除,也称B可以整除A。A*B表示A乘以B或称A乘B,B乘A,B乘以A……都一样。复习一下小学数学公因数:两个不转载 2013-09-24 20:10:16 · 999 阅读 · 0 评论