自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 收藏
  • 关注

原创 POJ 1009 Edge Detection

Google面试受挫,听说以后找实习找工作都会考这样的题目,决定在百忙中一天至少写一道题,题目从poj百练上找。Edge Detection是一道模拟类题目,但是如果逐个pixel进行计算,妥妥的TLE+MLE,思考半天无果,看了这篇博客以后明晰了思路,http://leons.im/posts/poj-1009-edge-detection-report/。我们解决这道题的本质是寻找转换后的图片中

2017-08-11 04:31:18 323

原创 POJ 1651 Multiplication Puzzle

好久不写blog了,也是因为各种各样的事情没有功夫写代码,新学期开始了继续努力~!算分课上讲了动态规划,这次拿这个题目练手,这次用数组m[i][j]存储区间i到j的最小做运算的数量,状态转移也比较简单,代码也单独拿出来作为一个函数这样看起来比较清楚。比较烦人的地方在于角标和实际数值之间的关系,倒腾了半天#include <iostream>#include <cstdio>#include <l

2016-03-21 17:32:09 198

原创 POJ 3295 Tautology

这道题是让判断一个MMF是否为永真式,所以要枚举每个变量的值,然后用求前缀表达式的方式,用递归求值,但是这道题有两个特别诡异的错误调试了很久,看了讨论区才突然明白是怎么回事。在递归的过程中我使用的是work()函数进行求值,然后使用了语句return work()&&work()然而这个语句是有问题的,在C++当中,如果第一个work()的返回值是0,那么后边的work()函数就不会被执行,所以应该

2016-01-20 15:34:03 291

原创 POJ 1014 Dividing

突然忘记怎么写背包,数据量比较小干脆直接深搜了一下,感觉速度还可以,相当于从大到小开始选然后暴力搜索,搜索到结果以后跳出,没有任何剪枝优化= =#include <iostream>#include <memory.h>#include <cstdio>using namespace std;int marble[7]={0};int sum = 0;int half = 0;int c

2016-01-17 16:53:18 240

原创 POJ 2027 No Brainer

卖萌题目不解释= =#include <cstdio>using namespace std;int main(){ int n; scanf("%d",&n); while(n--){ int a,b; scanf("%d%d",&a,&b); if(a<b) printf("NO BRAINS\n"

2016-01-16 10:57:50 425

原创 POJ 1258 Agri-Net

经典的求最小生成树的题目,只不过题目中的路线是由关联矩阵所给出的,还是套用最经典的算法,把所有的边按照长度从小到大进行排序,然后利用并查集顺次判断每条路的出发点和目的地是不是已经在一个等价类内部了,如果不是的话把这条边的长度加到总长度上然后把两个地点放在同一个等价类里面。另外注意本题一个case里面有很多组测试数据,注意初始化。#include <iostream>#include <algori

2016-01-16 10:53:28 212

原创 POJ 1159 Palindrome

写这个看似简单的题目才发现自己原来毛都不会(╯‵□′)╯︵┻━┻,加上网上有很多的解析其实讲的都不准确,导致了很多理解上的错误这道题就是求字符串s和字符串的逆序串s’的最长公共“子序列”,而并非所谓的最长“子串”,一般来说两个子串一定是连续的一段字符,而子序列可以是不连续的……然后问题来了,怎么求两个子串的最长公共子序列呢,这里用的是动态规划的方法,用数组dp[i][j]来记录两个字符串长度为i和j

2016-01-15 20:38:44 215

原创 POJ 2388 Who's in the Middle

水题…sort过了…但是如果题目的数据够强的话可以考虑用Ultra Quick Sort的方法来找中位数,时间复杂度更低#include <iostream>#include <cstdio>#include <algorithm>using namespace std;#define MAXN 10050int main(){ int n; int a[MAXN]={0};

2016-01-15 16:00:33 267

原创 POJ 1050 To the Max

动态规划的思想,用到的一个最基本的方法就是求一维数组连续数字串的和的最大值,状态转移方程为sum[i] = max(sum[i-1]+a[i],a[i])在二维的情形中就是先枚举任意两行,然后对每一列在这两行之间的数字先求和,然后对求出来的数组求其一维连续数字串的最大值,得到的就是以两行为上下界的矩阵的最大值。#include <iostream>#include <cstdio>#includ

2016-01-15 15:52:08 207

原创 POJ 1163 The Triangle

经典的DP题目,自下而上进行,状态转移方程为 dp[i][j] = max(dp[i+1][j],dp[i+1][j+1])+data[i][j];#include <iostream>#include <cstdio>using namespace std;#define MAXN 110int main(){ int n; int data[MAXN][MAXN]={0};

2016-01-14 22:17:43 205

原创 POJ 1011 Sticks

寒假决定开始刷题了,写这道题主要是为了克服内心的恐惧感…大一的时候学DFS的时候听这道题给吓傻了,各种剪枝的方法不知道从哪里入手,比较关键的剪枝应该是当组成一个新的木棒的第一个片段失败的时候,这个片段就永远都会失败,不会再次使用另外再审题的时候出了一点问题,它说每个碎片的长度不超过50,我按照,木棍的长度不超过50写的,这道题因为保证一定有解所以设置长度搜索的上限的时候不需要有一个上限。#inclu

2016-01-14 18:26:49 296

原创 POJ 3481 Double queue

有点谜的题目…不知道什么叫做双队列…维护了一个map水过了#include <map>#include <iostream>#include <cstdio>#include <iterator>using namespace std;int main(){ int n; map<int,int> m; while(scanf("%d",&n),n){

2015-12-29 14:06:42 265

原创 POJ 2001 Shortest Prefixes

题目要求要给所有字符串找一个最短的前缀,让能够根据这个最短的前缀与其他的字符串区别开,这里用一个字典树,每个节点记录相应字母出现的次数,在建立完字典树之后查询的时候遇到1或者字符串遍历到结尾的时候进行输出,比较容易的题目。#include <iostream>#include <cstdio>#include <memory.h>using namespace std;#define maxp

2015-12-29 14:03:23 221

原创 POJ 3735 Training Little Cats

刚开始看三种操作就有点像矩阵的基本行、列运算,觉得应该用矩阵,但是之前某次考试的时候用矩阵乘法超时了,而且一直没有用矩阵解决过实际问题,这次也算是长了姿势三种操作对应三种基本矩阵,在由于基本矩阵属于稀疏矩阵,因此可以用一个小的优化来加快矩阵乘法的运算速度(下面是a与b矩阵相乘得到c矩阵):for(int i=0;i<n;++i){ for(int j=0;j<n;++j){

2015-12-25 23:59:41 216

原创 POJ 2752 Milking Grid

这是数算期末的压轴题,一共只有9个人AC了,而且120+的WA… 看了一下觉得题目还是有点思路的,不过实际做起来还是贡献了无数的WA如果有一个块可以重复的话,那么这个块中的每一行和每一列都一定可以是重复的,因此用kmp算法求出每个行的最小覆盖长度和每一列的最小覆盖长度,然后分别求最小公倍数值得注意的是最小公倍数有可能大于r,c,因此在循环计算最小公倍数的时候应该额外判断一下。#include <i

2015-12-22 22:44:57 235

原创 POJ 2406 Power Strings

典型的用kmp求循环节的题目,套用模板即可~#include <cstdio>#include <memory.h>#include <cstring>#include <iostream>using namespace std;#define maxn 1000050char str[maxn]={0};int next[maxn]={0};int main(){ while(sc

2015-12-22 19:44:58 221

原创 POJ 1521 Jungle Roads

最小生成树的问题,数据量比较小,用dij算法,把所有路径的按照长度从小到大进行排列,设置一个并查集确定两个地点是否已经连接在一起了。P.S. Priority Queue有毒…#include <cstdio>#include <memory.h>#include <algorithm>#include <iostream>using namespace std;#define maxp 3

2015-12-22 19:02:51 243

原创 POJ 2002 Squares

之前没怎么做过这种几何的题目,这次通过这道题也是知道了一些简单的做几何题目的思考方向,本题就是在一大堆点中找正方形,值得注意的是正方形有可能是斜着的= = 大体思路是对点进行枚举,先按照横纵坐标从小到大的顺序排序,然后对点进行两两配对,以配对的两个点为基准,找另外两个点在不在我们的点集里面。现在的问题就在于如何确定另外两个点在哪里,画一个草图以后我们可以看到已知两个点,确定一个正方形有两种可能,但是

2015-12-21 23:35:02 195

原创 POJ 1936 All in All

比较水的题目,对两个字符串都进行一次遍历,看看能不能对应起来,比kmp要简单的多#include <iostream>#include <cstdio>#include <memory.h>#include <string.h>using namespace std;#define maxn 100050int main(){ char str1[maxn],str2[maxn];

2015-12-21 21:42:04 256

原创 POJ 2823 Sliding Windows

这次是要求连续变化区间内的最大值和最小值,我维护了一个map就ac了… 不过听别人说可以维护一个单调队列,但是效率也并没有高很多 == 线段树应该是也可以的,不过线段树可能更适用于任意区间的查询、有空再研究单调队列好了~#include <iostream>#include <map>#include <cstdio>#include <iterator>using namespace

2015-12-21 20:46:36 235

原创 POJ 3250 Bad Hair Day

这道题提供了一个特别新奇的思路,单调栈! 今天刚考完数算实习,跪得一塌糊涂,满脑子都是线段树树状数组,考完试周围的竞赛爷一直在讨论什么kd树,什么状态压缩什么的完全听不懂,我还是默默准备我的数算考试吧。单调栈就是维护一个单调的栈,我们在本题中要求的不是每一头奶牛能看到多少个头,而是每个奶牛的头会被多少其他的奶牛看到,因此我们每次读入一个高度,就与栈顶的数字进行比较,如果比栈顶数字大,那么就一直弹出

2015-12-21 20:20:12 244

原创 POJ 2182 Lost Cows

趁热来一发线段树,主要是联系一下线段树的基本操作,写了两道题之后确实感觉手感好了很多,这道题的思路是,从后向前挨个数,最后一个牛总是可以判断是第几个,然后就把相应的位置占住,以后再数的时候就不能数已经占住的位置了,说的不是很清楚,但是代码的思路比较清晰:#include <iostream>#include <cstdio>#include <memory.h>using namespace

2015-12-20 15:09:21 242

原创 POJ 2481 Cows

这道题是要求e更大且s更小的牛的数量,首先把所有的数据读入之后按照e从大到小,e相同的情况下s从小到大的顺序来排列;从头开始遍历,这样能够保证e一定比前面的小,只要数前面有多少个s比自己的s小就可以计算出来有多少牛比自己更强,这种每次都要遍历数前面有多少个s比自己小的题目最好使用树状数组,能够更快地检索。#include <iostream>#include <cstdio>#include <

2015-12-18 13:13:13 151

原创 POJ 2492 A Bug's Life

老样子,经典的并查集题目,和Find them,catch them几乎一样的做法,只不过增加了一个判断,在两个结点的父节点相同的时候判断一下他们俩的新关系和原有的关系是否有矛盾;另外注意即使有矛盾也不能提前跳出循环,因为还有很多数据要输入= =#include <iostream>#include <cstdio>#include <memory.h>using namespace std;

2015-12-17 16:33:11 181

原创 POJ 2299 Ultra-QuickSort

这个题目的本质是求一个数组的逆序对的数量,在线性代数里面一个求逆序对数量的方法是,每次取所有剩余数字当中最小的数,然后数一数这个数前面有多少已经取出来的数字,即为当前这个数字所贡献的逆序数,所以本题就要模拟这个过程,排序之后每次取出最小的数然后开始数但是直接的模拟会导致超时,因此采用树状数组对已经取出来的点的个数进行记录,每次求和然后更新注意用long long 存储最后的答案#include <i

2015-12-17 14:27:07 282

原创 POJ 1875 Binary Search Heap Construction

本题实现的是treap的结构,从key的角度来看是一个BST,从priority的角度来讲是一个heap,如果用treap的定义,每次插入进行旋转,这道题会超时,因此先针对key进行排序,排序好之后再按照顺序插入到treap中。这里一个小技巧是,将treap[0]的位置的priority置为INT_MAX,这样保证无论treap结构如何变化,根节点总是treap[0]的右孩子,防止根节点变化带来的麻

2015-12-16 20:02:55 260

原创 POJ 3261 Milk Patterns

继续练习后缀数组的题目,这次也是比较经典的题型,求出来的重复k次的子串可以重叠,求height数组之后,计算连续的一片区域使得height[i]都大于k再记录几个易错点: 1、在原始的数组后面要补充一个数字0,不然的话计算后缀数组的时候会出现问题,同时数组长度会变成n+1,因此在计算后缀数组的时候参数输入的时候要注意+1; 2、在check函数当中,发现第一个大于k的height[i]时,计数器

2015-12-10 17:47:26 219

原创 POJ 1703 Find them, Catch them

并查集的经典题型,一共有两种操作:两个案件AB不是同一个团伙,询问AB是不是同一个团伙作案我在结构体中定义两个元素,一个记录其父节下标,另一个记录其与父节点的关系,如果是同一个组织那么就记为0,否则记为1,在进行带路径压缩的查找父节点操作的时候可以用异或运算来计算节点与根节点的关系。利用这种思路也可以解决另一道叫做“食物链”的题目#include <memory.h>#include <iostr

2015-12-10 17:28:33 273

原创 POJ 3080 Blue Jeans

作为后缀数组的练习题,更好地理解后缀数组的用法,来写了这道题,应该是比life forms那道题更简单一点,整个程序结构和那道题几乎是一模一样的,这次更好地理解了check函数里面一些细节,比如记录位置变量i经常会在循环里面++了一次,下面在进行处理的时候就要人为地-1,这道题还是挺简单的,对后缀数组的用法又加深了印象。#include <stdlib.h>#include <cstdio>#i

2015-12-08 17:52:13 223

原创 POJ 1610 Quad Trees

又是一周数算实习,马上就要上机考试了整个都要不好了,还好这一次的四分树作业给了我一丢丢的信心…作业是禁止使用STL的,而且明确要求必须用空间数据结构,所以这道题本来可以用广搜写的很简单,但是为了满足作业需求我还是使用了四分树,并且用数组模拟了队列进行广搜,直接用队列广搜会有更好的效果。总体思路就是根据每个区块的特点去建立一个四分树,四分树的每个结点就代表这一个区块的特性,如果state1的值为1,就

2015-12-08 13:44:38 483

原创 POJ 3294 Life Forms

老实说跑过来写博客是很惭愧的…毕竟没有靠自己的能力解决这道题…代码的关键部分也是借鉴了同学的,但是毕竟还是花了我3个小时的时间来调试,所以还是来稍微记录一下以免以后再忘记。本周的学习内容是传说中的后缀数组,本来是试图弄明白后缀数组是怎么求出来的,在研究两位大神的论文无果之后,决定还是退而求其次研究研究后缀数组怎么用,模板什么的大不了下功夫先背下来等以后有了更深的体会以后再拿来研究研究。后缀数组就是把

2015-12-07 21:43:09 221

原创 POJ 1442 Black Box

上了半个学期的课以后才发现,原来从来没有认真听过的数算实习才是幕后的大BOSS…每次作业的题目都虐到爆,每节课讲的数据结构都是数算课程上面简单数据结构的升级版,第一次靠自己的能力强行AC了Treap,把自己都感动了。简单总结一下树堆的性质:1、树堆,顾名思义就是树和堆的结合体,每个结点除了value值以外还增加了一个priority的值,是每个结点的权值,以最大堆为例,权值最大的点始终在堆的顶部,同

2015-11-24 22:31:24 270

原创 POJ 1928 The Peanuts

这两天的作业题目都没有什么技术含量,这道题只需要把每个有花生的点按照花生的量从大到小排起来,然后从头开始一个一个找,如果能摘到花生并且安全走到公路上就把花生加到我们的总数上。注意每次判断能不能走到某个点的时候要把走回到公路的时间也算上,判断完之后要注意在把走到公路所用的时间减去。总之没什么技术含量……简单粗暴#include<iostream>#include<cmath>#include<cs

2015-11-22 18:33:37 300

原创 POJ 3664 Election Time

为了图省事不自己写排序函数,就想着先用sort先排一次,然后剩下的K个就用bublle来排…没想到竟然TLE,本着将懒人精神发扬到底的信念,我定义了两个一模一样的结构体,分别重载了两个小于号然后用sort排序…尽管看起来有点蠢,但是还是过了……这会突然想起来找最大值根本不需要排序,直接遍历一遍就好,看来我还是太蠢惹…#include<iostream>#include<cstdio>#inclu

2015-11-22 16:27:27 556

原创 POJ 3702 距离排序

做完作业去百练上提交这道题目,发现去年的这几天的提交记录,WA了无数条也没有过 = = 也不是很懂为什么内排序的题目还会把这道题扒拉出来思路很简单,把所有的点记录下来然后把每两个点的距离分别求出来然后和两个点的坐标一起存起来,最后进行排序排序用qsort应该是不行的,快排是不稳定的算法,这道题对算法的稳定性有要求,所以直接bubble排序。另外一个注意点是求距离的顺序,我用的是先求(1,2)(1,3

2015-11-19 15:45:37 692

原创 POJ 1664 放苹果

打算在期末考试之前把数算的相关题目刷一刷,期末如果像期中这么惨就没得玩了,发现线性表里最水的一道放苹果,就顺手写掉好了,这样想想,放苹果还是我学的第一道递归的题目,当时真是理解了好久都没弄明白,后来程序设计实习的简单整数划分用DP也是累的够呛,重看这道题觉得当时自己真的好蠢= = 就从最简单的开始吧,每天写一点,避免期末的时候手忙脚乱程序只需要一个递归就可以完成了,notation(m,n)是m个苹

2015-11-18 19:42:44 255

原创 POJ 2049 Finding Nemo

某周日,回寝室路上,让室友帮忙找个东西,室友问找啥,答曰:Nemo。1、百练上只有不到一半的通过率还是有点恐怖的,这道题让nemo他爹找nemo,让我想到之前的走迷宫,于是想到用广度优先搜索的办法,只不过把原来的queue改成了priority——queue,让走过的doors数量最少的借点排在最前面,这样第一个走出迷宫范围的结点就一定最优解(我是每次从队列中取出元素之后再判断是否在迷宫外面,而不是

2015-11-17 17:39:26 397

原创 POJ 4083 我爱北大

这道题真的是目前为止见过的最有情怀的题目之一,感觉做完以后就不再爱北大了…1、因为最后要求输出任意两个路径之间的最短距离,因此我选择使用的Floyd算法(数据比较弱,样例代码是贪心,应该也能过),Floyd算法用一个dis[N][N]数组存储任意两个点之间的距离,用path数组存储路径。2、Floyd算法用的是动态规划的思想,设置初始数组为题目中所给的任意两个地点之间的距离, 然后每次更新这个二维数

2015-11-17 17:16:55 2142

原创 POJ 2352 Stars

新人第一次接触树状数组,上课也没有好好听讲,这里把做题的时候的一些经验稍微总结一下以免以后忘掉:1、对于一个树状数组c[n],其中每个元素的值是对应的原数组a[n - 2^k +1]到a[n]的所有数字的和;​2、其中的k为数字n的最低的不为0的位的位置,习惯上将2^k称为low_bit,求low_bit的方法为n&(-n);3、每一个节点c[i]管辖的范围的宽度都是2的幂数,low_bit(i)求出来的

2015-11-17 16:41:44 257

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除