杭电
XD灬
路漫漫其修远兮,吾将上下而求索
展开
-
杭电1053~~Entropy
这一题,题目很长,但是大多都是废话。主要的意思就是:给出一个字符串,将各个字符变成Huffman编码,并计算其长度。但是,需要注意的是,这里的字符,只需要统计大写字母和下划线的,其他的不需要统计。也就是其他Huffman编码的长度不用计算进去。这一题我是先构造Huffman树,再来计算各个Huffman编码的长度的。下面是AC的代码:# include # include usin原创 2015-03-25 19:02:32 · 581 阅读 · 0 评论 -
杭电ACM1010——深度优先搜索+奇偶剪枝
一个月之前,数据结构看完了深度和广度搜索,做这个搜索题目的时候,总是超时,后来才知道可以进行剪枝可以判断是否可以在T的时间内到达指定的地点。现在重新做了这道题,看了百度百科的奇偶剪枝,发现一下子就可以理解了,原来这个没有那么的难。这也让我明白了,有时候做题的时候,解决不了,或者看不懂的时候,可以先放一放,等以后再来做,思路拓宽了,没有仅限在这道题中,或许那时候你就可以做出来了,做题的心态和思路原创 2015-03-15 10:46:11 · 2142 阅读 · 0 评论 -
杭电1051~~Wooden Sticks
这一题,典型的贪心,题目意思很容易看懂,加工木块,计算设置木块的时间,后面的木块重量和长度都大于等于前面的,就可以不用重新设置,但按长度排序或重量排序,按从大到小或从小到大都可以。这一点大家想想为什么。这里我用的是长度来排序,长度相同的,按重量来排序。一开始我是这么想的,排好序之后,从中找到可以一次消掉最多木块的一组,这样一直消下去,但是,很可惜,超时了。后来想想,没有必要去找,直接从前往原创 2015-03-25 20:45:09 · 520 阅读 · 0 评论 -
杭电ACM—— 1042 N!大数阶乘
数的阶乘,到13!整型变量就会溢出。而要算到1000!,甚至到10000!就要用字符串的来模拟乘法运算。下面是代码:#include #include int main(){ int n, i, j, end; int a[100000] = {0}; while(scanf("%d", &n) != EOF) { memset(a, 0, sizeof(a原创 2015-03-03 22:17:32 · 2446 阅读 · 2 评论 -
杭电ACM——1023Train Problem II
这一题,主要是运用Catalan数。Catalan数的一个递推公式是h(n)= C(2N, N) / (N - 1),另一个递推公式是h(n)= h(n - 1)*(4*n-2)/(n+1)。这里主要运用的是第二条公式,因为前几个Catalan数我们可以知道的。在百度百科,可以看到很详细的解说,这里不多说了。Catalan数主要是运用于:1、出栈的方案数。2、N个结点,构成的不同二叉树原创 2015-03-06 18:44:49 · 606 阅读 · 0 评论 -
杭电ACM——1049Climbing Worm
这题是水题来的,主要的意思是一条虫,一分钟爬u英寸,爬了一分钟,就要休息一分钟,在休息的时候,就会掉下去d英寸。给出井的高度,求虫要用多久才能爬出去。下面是代码:# include using namespace std;int main(){ int n, u, d, run, count; while(cin >> n >> u >> d) { run = count原创 2015-03-06 19:39:50 · 743 阅读 · 0 评论 -
杭电ACM——1998奇数魔方阵!
魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2…n2的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。如3×3的魔方阵:8 1 63 5 74 9 2魔方阵的排列规律如下:⑴将1放在第一行中间一列;⑵从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列原创 2015-03-08 10:50:29 · 812 阅读 · 0 评论 -
杭电1272~~小希的迷宫——并查集判断是否存在环
今天,刚学习了并查集对于并查集,也有了一定的理解了。杭电1272这一题,主要是给你几对数,表示这两个数(可以理解为村落)直接有路,而从每一个村落到另外一个村落只能有一条路,也就是不能存在环。而并查集就是将有一定联系的村落组成一个部落(也就是集合),如果给的两个村落都存在于同一个部落,也就是存在环了。还有一种情况就是存在两个部落,也就是有些村落到不了另一些村落。这一点,我们需要通过判断 顶点原创 2015-04-04 22:29:30 · 609 阅读 · 0 评论 -
杭电1175——连连看~简单的广搜
这一题,做了好久,终于AC了,感觉题目有点坑,唉,题目不是很难,就是坑!!~~找一个错误,找了半天,后来才看到是变量用错了!!~题目中的b数组是标记数组。#include #include #include using namespace std;#define INF 1000000int xy[4][2] = { { -1 , 0 } , { 1 , 0 } ,原创 2015-04-22 22:23:02 · 869 阅读 · 0 评论 -
杭电ACM1081——To The Max
开始看到这题的时候,一点头绪都没有,本来想用暴力解决的,可是看到n可以到100,估计了下会超时,就放弃了,想过用动归做,但是没有想到如何去做。就暂且放下了。 今天再看到这题,百度了下,明白了如何去做了,就是将各行合并,再当作最大子序列来做,就很简单了。 n行,分别跟其他的行进行合并,然后动归计算最大值,不断的跟新最大值。附上AC代码: #include #include原创 2015-04-23 21:34:03 · 1271 阅读 · 0 评论 -
杭电ACM1181——变形课
这个题目,简单的搜索题,刚开始我是用并查集做的,结果很明显WA,后来想了下,如果有个单词m开头,b结尾的也可以,所以很错误的想法。运用广搜,可以很好的解决。我的代码中的是将字符串的位置i入队的,不是整个字符串。水题一个,下面是AC代码:#include #include #include using namespace std;bool vis[1000];char原创 2015-04-20 14:20:55 · 1372 阅读 · 0 评论 -
杭电ACM1878——欧拉回路
简单的欧拉回路,如题。欧拉回路的判断:1.在有向图中:首先必要的条件是图连通,所以顶点的入度都等于出度。2.在无向图中:首要条件还是图连通,其次就是所以顶点都是偶数度(该顶点的度为偶数)这一题是无向图,所以根据判断方法来写,很简单,判定就不证明了。我是用并查集来判断图是否连通的。下面是AC的代码:#include #include using nam原创 2015-04-29 16:00:10 · 1062 阅读 · 0 评论 -
杭电ACM1671——Phone List~~字典树
这一题,也是简单的字典树的应用,不过这里不是字母,而是数字。题目的意思是判断输入的字符串会不会是其他字符串的前缀。就是这么的简单。下面是AC的代码:#include #include using namespace std;class node //结点的结构体{public: node* P[10];};node* root;原创 2015-04-29 15:39:56 · 606 阅读 · 0 评论 -
杭电1233——还是通畅工程~简单最小生成树问题
这题,典型的最小生成树问题,可以用Kruskal算法来实现,配合着并查集来高效求解。先将各边按权值进行从小到大排列。遍历一个各边便可求解,时间复杂度为O(|E|log|V|),其中E为边的个数,V为顶点数。下面是AC代码,代码中有注释:#include #include #include using namespace std;class data原创 2015-04-27 14:44:01 · 731 阅读 · 0 评论 -
杭电ACM1194——Beat the Spread!
简单的数学题目,就是解方程。不过需要注意的是,解出来的两个解没有负数。输入m和n,方程1:x + y = m;方程2:| x - y | = n;x = (n + m)/ 2; y = (-n + m)/ 2;注意:n + m和m - n 必须是偶数!~~做个判断就OK了。AC的代码:#include using namespace std;int main(){原创 2015-05-02 19:57:09 · 961 阅读 · 0 评论 -
杭电ACM1163——Eddy's digital Roots
这题主要是找规律,第一次找出来!~~题目的意思是求一个数的digital root,这个所谓的digital root也就是一个数的各位数之和,如果这个数的两位数以上,重复再算digital root,直到这个数是一位数。这一题就是求n^n的digital root。规律如下:n个n相乘的结果假设为S,S的digital root 等于这n个数的digital root的相乘。原创 2015-05-02 15:02:54 · 1102 阅读 · 0 评论 -
杭电1256——画8
这题很简单,算出第一行有几个,和竖线宽度就OK了。知道了竖线宽度和第一行有几个字符,剩下的都很简单了。下面是AC代码:#include using namespace std;int main(){ int n, m; char a; cin >> n; while(n--) { int i, j; cin >> a >> m; int q = (m -原创 2015-04-27 22:08:08 · 806 阅读 · 0 评论 -
杭电ACM1242——Rescue~~BFS+优先队列
这题,简单的BFS就可以搞定。题目的大概意思是最短时间从地图的r到达a。一开始,用普通的队列来做,结果内存超了,原因是N和M最大200;普通的队列会浪费一大堆内存,所以应该改用优先队列来做。下面是AC的代码:#include #include #include using namespace std;class data{public: int x, y, cost;原创 2015-05-09 15:12:50 · 749 阅读 · 0 评论 -
杭电ACM1035——Robot Motion
这一题,简单的递归就可以搞定。题目的意思是给出一个指令的二维数组,让一个机器人来走,第一种情况,可以走出去,算出多少步,第二种情况,一直无限走,存在一个环,算出环有几步,其他的有几步。下面是AC的代码:#include #include using namespace std;bool vis[15][15]; /原创 2015-05-02 22:31:31 · 883 阅读 · 0 评论 -
杭电ACM1116——Play on Words~~欧拉路径与欧拉回路
这一题,相比之前做的题目,增加了欧拉路径的求解。而且这一题是有向图。题目大概的意思就是成语接龙,能接起来就算可以打开门,因此要考虑两种,一种是回路,另外一种是一条路径。第一次WR就是因为没有考虑回路这一个因素。有向图中,欧拉回路与欧拉路径的求解方法:1.欧拉回路:首先当然是图连通,其次就是所以顶点的入度都等于出度。2.欧拉路径:首要的还是图连通,然后就是存在一个顶点的出度大原创 2015-04-30 12:16:05 · 999 阅读 · 0 评论 -
杭电ACM1236——排名
这一题,比较麻烦,可以说是简单的结构体的应用。输入的数据量比较大,用scanf比较好一点,还有一点比较难的是如果分数一样,要按考生号的升序来输出。我用一个结构体来存每一个考生的考号和总成绩,然后排序,算出有几个合格,再输出。下面的是一次AC的代码:#include #include #include #include using namespace std;class原创 2015-05-03 11:06:55 · 1419 阅读 · 0 评论 -
杭电ACM1039——Easier Done Than Said?
这一题,简单的字符串处理。只是题目的要求比较麻烦。题目的大概意思是:给你一段字符串,判断是否可以被接受。判断的条件为:1.存在一个元音。(元音有a,e,i,o,u)2.不能有连续的三个元音或者连续的三个非元音。3.不能有连续的两个相同字符除了e和o可以之外有了这些条件,就很容易了。下面的是一次AC的代码,有详细的注释:#include #include usin原创 2015-05-03 10:21:53 · 895 阅读 · 0 评论 -
杭电ACM1087——Super Jumping! Jumping! Jumping!
这题,简单的动态规划,也就是求最大连续子序列的和,是和最大。知道了这个,就可以很容易的写出代码来了。状态转移方程:dp[i] = max{ dp[j] } + a[i] ( j >= 0 && j 有了状态转移方程,一切都是很简单了。下面的是一次AC的代码:#include using namespace std;int main(){ int dp[1005], a原创 2015-05-03 11:55:49 · 1200 阅读 · 0 评论 -
杭电ACM1251——统计难题~简单字典树的应用
字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。(以上的摘自百度百科~)题目的意思:给出一些单词,让你统计以某个字符串为前缀的单词有多少个。一开始,我用暴原创 2015-04-28 08:07:55 · 1069 阅读 · 0 评论 -
杭电ACM1248——寒冰王座
简单的完全背包。将三种物品的价格可以理解成既是价值,又是重量。简单动态规划AC代码:#include #include using namespace std;int dp[10005];int a[3] = {150, 200, 350};int b[3] = {150, 200, 350};int max(int x, int y){ return x >原创 2015-04-28 09:23:12 · 5978 阅读 · 1 评论 -
杭电ACM1249——三角形
三角形平方平面,推到一下,就可以得出公式:F(1) = 2. F(2) = 8; F(n >= 3) = F(n - 1) + 6 * (n - 1)。AC代码:#include using namespace std;int a[10005];int main(){ a[0] = 0; a[1] = 2; a[2] = 8; for(int i = 3; i <原创 2015-04-28 09:19:54 · 626 阅读 · 0 评论 -
杭电ACM1286——找新朋友~欧拉函数的应用
欧拉函数欧拉函数,对于正整数n,欧拉函数就是小于或者等于n的数中与n互质的数的数目。通式为:F(x) = x * (1 - 1 / p1) * (1 - 1 / p2) * ....... * (1 - 1 / pn);p1,p2,p3.....pn为x的质因子。每一质因子只出现一次。即p1 ≠ p2 ≠ ....pn; 例如12 = 2 * 2 * 3;2只能算一次。有了这个欧拉原创 2015-04-28 14:43:55 · 981 阅读 · 0 评论 -
杭电ACM1102——Constructing Roads
这题,简单的最小生成树的应用,只是输入的方式比较特殊。还会告诉你哪一些村庄是已经有路的。输入的第一个数n,是村庄的数目,然后下面n * n 个数代表的是:第i行第j个就是村庄i和j之间的距离。理解了这个,就很容易写出代码了。下面是AC的代码:#include #include #include using namespace std;class data原创 2015-05-02 18:24:39 · 658 阅读 · 0 评论 -
杭电ACM3018——Ant Trip~~欧拉回路
这题,欧拉回路的应用,只是比较麻烦。题目的意思是,一群蚂蚁,想要走遍给定的每一条边,但是,图不连通或者不存在欧拉回路的不可能走完,所以可以将人分组,求解最少的分组的数目。解题的主要思路是:1.将各点进行合并,使用并查集。2.遍历并查集,查找各个连通图的奇数度的个数。3.如果该连通图的奇数点为0,只需一笔。如果不是,就需要奇数点的数目 / 2。还有一点需要注意的是,单个点应该原创 2015-04-29 21:36:33 · 539 阅读 · 0 评论 -
杭电ACM1060——Leftmost Digit
这一题,主要是数学方面的知识,将ans = n^n进行化简。两边取log。得到log(ans)= n * log(n);再推出ans = 10 ^ (n * log (n));10的整数幂,只会在ans后面加上一个0,小数的幂才会影响ans的其他有效数字。所以求出n * log(n)的小数部分temp,然后(int)10^temp就是所要求的结果。数学,很重要!!~·下面的是A原创 2015-05-04 12:13:30 · 1004 阅读 · 0 评论 -
杭电ACM1025——Constructing Roads In JGShining's Kingdom
题目的意思是,两行城市,从左到右为1,2,3……n个城市。上面的下面的城市要与上面某个的城市相连,在不出现相交的情况下,最多可以连多少条。知道了题意,就知道了应该用DP来做。这一题,数据量比较大,用普通的DP,时间复杂度为N^2,会超时,我们应该用另一种DP方法,时间复杂度为nlogn。nlogn的DP的思路大概就是给你一个数,插到一个数组中,该位置已存在,就覆盖它。也就是可以用二分查原创 2015-05-03 23:14:56 · 994 阅读 · 0 评论 -
杭电ACM1027——Ignatius and the Princess II
这题,找了好久,都没有找到是什么规律,百度了之后,才知道是第几个最小的排列是枚举排列的第几个。真是长知识了!!~知道了这样的规律之后,就可以很快的写出了,algorithm这个头文件中又一个枚举排列的函数next_permutation,第i个最小的排列,就是调用next_permutation i - 1次之后的那个排列。next_permutation同样的适用与可重集,也就原创 2015-05-04 14:40:04 · 849 阅读 · 0 评论 -
杭电ACM3415——Max Sum of Max-K-sub-sequence
一开始,看到这题,以为是最大连续子序列和的问题,写出了代码,提交了,WR,找了一些测试数据,结果发现这个算法并不能将所以的序列的解求出,只是满足一部分序列。百度了一下,知道了要用单调队列来求解。单调队列,也就是队列中必然是单调递减的或者递增的。而这题使用的是单调递增的队列。单调队列使用的是双向队列,队尾队头都可以删除元素,只能从队尾插入元素。比如求解一个数列{1 ,2 ,5 ,原创 2015-05-05 11:43:45 · 580 阅读 · 0 评论 -
杭电ACM1162——Eddy's picture~~最小生成树
这一题,就是简单的最小生成树的应用。开始,没有想到用最小生成树做,想到的是贪心,当知道了用最小生成树做的时候,还犯了一个很严重的错误,就是时间复杂度的估计错了,导致开始不敢写,在想其他的办法。当作一次教训吧。下面是AC的代码,有详细的注释,用的是并查集来判环,时间复杂度为nlogn,主要时间在排序上。#include #include #include #include using原创 2015-05-02 10:59:47 · 844 阅读 · 0 评论 -
杭电ACM1237——简单计算器
简单的表达式求值,A了好久,坑。AC的代码:#include #include #include #include using namespace std;int main(){ char str, c; double a, b; stack num; while(scanf("%lf", &a) != EOF) { while(!num.empty())原创 2015-05-06 22:49:45 · 2515 阅读 · 0 评论 -
杭电ACM1269——迷宫城堡~~并查集
这题,可以用并查集来解决。需要用到两个数组来判断从i到j以及j到i的是否属于同一个并查集。下面的是AC的代码:#include #include using namespace std;int par[2][10005];int n, m;int finds(int x, int i){ if(x == par[i][x]) return x; else ret原创 2015-05-16 20:44:30 · 1030 阅读 · 0 评论 -
杭电ACM1210——Eddy's 洗牌问题~~找规律。
例如:n = 3一开始,序列为1 2 3 | 4 5 6然后序列为 4 1 5 | 2 6 3接着为 2 4 6 | 1 3 5最后为 1 2 3 | 4 5 6所以m = 3.找出规律就可以解决了,只需要第一个数,也就是1的位置重新回到位置1,那整个数列就变回开始的序列了。1的位置 i 小于等于原创 2015-05-16 21:17:36 · 882 阅读 · 0 评论 -
杭电ACM1180——诡异的楼梯~~广度优先搜索
这一题,简单的广搜就可以搞定,只是在搜索的时候判断比较麻烦,遇到楼梯的时候,有多种情况,停下来等,或者走其他路,来到楼梯,楼梯是否可以直接上等等的判断。一开始WR,就是在楼梯可以直接上的时候,没有判断走出楼梯的那一个是否可以走,所以WR了3次。下面AC的代码:#include #include using namespace std;class Node{public:原创 2015-05-07 21:58:21 · 816 阅读 · 0 评论 -
杭电ACM1166——敌兵布阵~~线段树
这一题,暴力的方法超时。只能用线段树来求解。对于线段树,只是初学,还不是很懂,看了大神的博客,慢慢敲出来的。关键还是那些递归的过程。递归的过程,也是理解了大概,也很难讲清楚递归的过程。下面的是AC的代码:# include # include # include using namespace std;const int N = 50005;class Node{p原创 2015-05-20 20:41:30 · 787 阅读 · 0 评论 -
杭电ACM1312——Red and Black~~广搜
这一题,简单的广搜或者深搜都可以搞定,时间复杂度都差不多。我用的是广搜。题目的意思是:@是一个人的起始位置,#不可以走,. 可以走,求出可以走的位置的个数。一开始没有用结构体来存储坐标,直接用的是z = x * 10 + y;将z入队,结果错了,原因是在取余整除的时候会出错。改用结构体就OK了。下面是AC的代码:#include #include #include using原创 2015-05-21 22:44:13 · 634 阅读 · 0 评论