C++
文章平均质量分 59
ZXLS-ZMR
我喜欢编程喜欢学习新的知识
展开
-
堆栈的应用-进制的转换
学了堆栈,我们都会了解,它的一个显著的特点:先进后出,就像把东西放在桶子里面,先放的在下面,要拿就要从上面开始拿出来。了解这个原理,就好了。来一个实用的吧,就是进制的转换。二,八,十,十六进制的相互转换。(本程序对十六进制,含有字母的没做处理,但由其他进制的可以转成十六进制)就是有一点点瑕疵。不过,这个问题不大,把输入的字母转化为数字就行了。其他的都可实现啦。#include#i原创 2013-04-01 13:06:52 · 1004 阅读 · 0 评论 -
二分查找
二分查找的思路:对一个有序的数列,给我一个数k,我都可以把这个序列分成二分,即在这两边存在一个大于该数k,一个小于该数。这就相当于猜数字,你出一个数字,让我猜,对于我给的答案,你只要告诉我比该数大,还是小,或相等。我就可以一次判定该数的范围,最终找到答案,这个类似以优选法,但那并不是猜中间的,而是根据黄金比例猜的,也叫0.618法,这个数很神奇,斐波拉契数列的通式也有一这样的数(√ 5 -1)/2原创 2013-04-21 16:23:47 · 728 阅读 · 0 评论 -
贪心算法-求区间至少连续k的最大和
题意:对于一个整数n,表示该区间整数的个数,求至少有k个连续的数是该区间中一段的最大和。n的范围在1~10^6。k(-1000~1000);分析:这道题看似有点像树状数组,但要想求出区间至少有k个连续的数的和是最大,恐怕是有点难度,顶多是求某一区间的和。不过可以沿着这个思路想,sum(n)-sum(i)?。如果这样想,我们就要判断n-i>=k;那换种思路:在第i的前面寻找最小值,在原创 2013-04-14 16:59:53 · 2118 阅读 · 0 评论 -
背包问题-Bone Collector
这道题是典型的简单背包问题,其他就不必多说。代码很简单。#include#include#include //调用max函数。 using namespace std;int f[1005];int Wi[1005],Di[1005];int main() { int n,m,i,v,t; cin>>t; while(原创 2013-04-08 18:48:41 · 699 阅读 · 0 评论 -
poj1861最小生成树(并查集)-kruskal算法
Kruskal算法是一种按网中边的权值递增的顺序构造最小生成树的方法。其基本思想是:设无向连通网为G(V,E),令G的最小生成树为T,其初态为T=(V,{}),即开始时,最小生成树T由图G中的n个点构成,顶点之间没有一边,这样T个边顶点各自构成一个连通分量。然后,按照边的权值由小到大的顺序,考察G的边值E中个条边。若被考察的边的两个顶点属于T的两个不同连通分量,则将此边作为最小生成树的边加入T原创 2013-04-23 21:28:34 · 970 阅读 · 0 评论 -
poj1251-Kruskal算法
The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money was spent on extra roads between villages some years ago. But the jungle overtakes roads relentlessly,原创 2013-04-25 18:32:08 · 655 阅读 · 0 评论 -
poj1287-Kruskal和prim算法。
学了这两种算法,总觉得还没完全体会,体会两种方法的不同,我个人喜爱用Kruskal算法,因为它不像prim算法那样还要初始化,for语句也要小一些,看起来比prim算法更整洁。下面以poj1287为列:DescriptionYou are assigned to design network connections between certain points in a w原创 2013-04-26 14:21:37 · 1141 阅读 · 0 评论 -
2013ACM多校联合(4)_NUN -ZZ买衣服
题意:衣服的品牌是有字符串表示,ZZ买衣服不喜欢买相同的品牌。(字符串的长度小于20,N,M小于100000)输入N,M,第一个表示她已经有了N种品牌的衣服,M代表她将要买的品牌衣服。如果以前没有这种品牌的衣服就输出YES,否则就输出NO。这题真坑了我,我没注意,M输入的品牌要加入她已经买过的品牌,先没注意到这点,直接就想到了二分查找。交上去WA几次了。后来问学长。才知道这回事。二分查找就行不通了原创 2013-04-28 13:47:52 · 1023 阅读 · 0 评论 -
列队-小型计算器
题意:对简单的‘+’,‘-’,‘*’,‘/';进行运算,运算的结果保证在长整型范围内。对除以0的输出"impossible".输入的运算操作均合法。输入的字符串长度小于50,数值没有小数出现。本题的意图很明显,就是依靠列队来或堆栈来实现。规定了一些条件,从而大大地降低了难度。分析也很容易。比如算:2+3*5-2;对于合法的运算操作,我们可以知道,操作数比操作符多一个,并且是相互交替,奇原创 2013-04-30 15:56:34 · 831 阅读 · 0 评论 -
poj1328-DP
没想到这是道水题,我先把意思搞错了,认为雷达是建立在小岛中,个岛相互联系,我就有点摸不着思路,无赖之下,到网上一搜,我才知道,自己想错了。这完全是数学分析题,先不说是不是DP,我们先要对问题进行模型化,即数学建模,既然是建在海岸线边,问题就简化了许多。简化为区间覆。,要使一个岛屿被圆覆盖,最极端的情况,就是刚好在圆周边上,这是一个处理问题的一个关键点,想想看,要减少雷达的个数,我们就必定把原创 2013-04-30 22:19:07 · 752 阅读 · 0 评论 -
poj3292
#includeusing namespace std;#define MAXN 1000001int rec[MAXN],keep[MAXN];void make(){ int ans=0; for(int i=5;i<=MAXN;i+=4) { for(int j=5;j<=MAXN;j+=4) { int sum=i*j; if(sum>MAX原创 2013-05-08 18:40:55 · 622 阅读 · 0 评论 -
poj2250-打印单一LCS路径。
题目连接题意:就是一个最长公共子序列。并打印其路径。分析:最长公共子序列还不难,注意是打印它的一条路径。我们知道是用二维数组dp来保存它的匹配数。一旦有匹配的它就修改后面的值,保证了如何一个状态当前的dp数据中是最大的值。看一张经典的图:显示了路径的回溯。帮助我们能找到匹配的的过程。为了记录它转移的方向。我们需要用辅助数组map来记录它是有那个状态转移而来的。可以用递归原创 2013-05-23 11:09:13 · 817 阅读 · 0 评论 -
poj1934-打印LCS全部路径+搜索
题目连接题意:打印全部LCS路径,并按照字典顺序输出。本题比较难。参考神人代码稍做改进如下:#include #include #include #include #include using namespace std;const int N=100;set SET;char s1[N],s2[N],temp[N];int len1,len2,lon原创 2013-05-23 20:25:17 · 1181 阅读 · 0 评论 -
poj3126-prime+BFS
题目连接分析:这题是在1000-10000之间,从一个素数变换到另一个素数。我们会想到先打印素数表,然后进行搜索。另外,对素数的变换,我们应进行为的变换。采用queue来存。代码如下:#include#include#include#includeusing namespace std;int k,m;int a[4]={1,10,100,1000};int原创 2013-05-25 10:28:18 · 802 阅读 · 0 评论 -
poj-3159,SPFA+堆栈
题目连接分析:本题是通过最短路径来求差分约束问题。关于差分约束问题,为什么可以用最短路来求解。可以到网上找。求最短路径,这题因为点比较多,所以用spfa写方便些。不过用列队会溢出,用循环列队会超时,所以这题可以用栈来实现。即节省空间,又可省时间。代码:(弱弱地参考别人代码)#include#include#include#define INF 1000000using na原创 2013-05-26 22:14:37 · 1077 阅读 · 0 评论 -
服务员-dp
题意:服务员要服务每个顾客,顾客在订蛋糕后,要求服务员把蛋糕分成一份。对于蛋糕总体积(n),每次分成开成两个部分,要花费n*(n-1),而后面又有顾客来订蛋糕,时间可能发生了冲突,为了服务更多的顾客,可以放弃花费时间多的顾客,以确保服务顾客数量最多。第一组k,表示顾客的总人数。接下来是k组数据,每组两个,第一个是顾客到的时间,第二个是订的蛋糕体积。输出最多服务顾客的总数。分析:原创 2013-04-17 19:45:51 · 913 阅读 · 0 评论 -
poj3635-DP+优先队列搜索最短路
题目连接这题限制较高。一般的算法过不了。自己做起来很吃力。到网上参考牛人代码为之惊叹,处理方法真是不可思议。佩服!佩服!这题难点就是如何判断汽车加油的问题。为什么加油是一升一升地加。主要是设计的dp搜索是关于路径与油的体积的状态。我认为非常巧妙。把问题简化了许多,能用的dp的思想和优先队列来进行搜索,为之叫绝。稍微简化了代码,时间也减小了点,心里还是稍有点欣喜。#inc原创 2013-05-27 22:18:09 · 1075 阅读 · 0 评论 -
poj2449-A*算法+优先队列+第k最短路
点击打开链接分析:A*算法主要由是估价函数f(n)=g(n)+h(n);其中g(n)代表当前的实际代价。h(n)是估计代价。算法的效率直接取决于h(n)的评价性。h(n)的设计思想是无限靠近(极限).在本题中,g(n)代表从初始位置到当前x点所付出的代价。h(n)代表从当前x点到目标位置的估计代价。本题关键是怎样求h(n),每个点到目标点t不一定联通。也不好估价,巧妙之处是:从目标t到原创 2013-05-28 21:18:38 · 1129 阅读 · 0 评论 -
几何题-求圆柱最大体积
点击打开链接总是把问题看的太复杂,还以为是三分查找。这题根本没这个必要。只要使圆周刚好与边相等就行了,矩形中最大的圆就是取最小边作为直径就行了。再分别以两边为高,比较就行了。水啊!代码:#include#include#includeusing namespace std;const double pi=acos(-1.0);int main(){ double原创 2013-05-30 22:21:51 · 1304 阅读 · 0 评论 -
poj-2001字典树
题目连接字典树确实是个好东西,操作也比较简单,插入,和查询是字典树的基本操作。只要语法过硬,看下字典树的插入和查询的范例,没什么难度的。代码:#include#include#includeusing namespace std;struct tire{ int num; tire *next[26]; tire(){ num=0; memset(next,0,s原创 2013-06-17 14:44:24 · 643 阅读 · 0 评论 -
HDU2222-tire,AC自动机
好吧!为了以后复习,也为了与大家分享!我把书上的简介打到这里.基本概念:AC自动机是一种特殊的自动机,是通过在tires树上添加一些额外的边组成,其核心部分是后缀节点的构建。算法:AC自动机的构建分两步,首先通过所有的模式串建立起tire树,然后从树根向下一次计算每个节点的后缀节点。AC自动机后缀的建立过程和kmp算法中next数组的求解过程十分相似,这里我们也用next数组来原创 2013-06-07 22:47:57 · 787 阅读 · 0 评论 -
poj3630-tire
题目连接如果是TLE那就是分配内存超时了,动态分配就有行不通了。所以这题要静态分配内存。但这题让我RE很多次了,不知道什么原因,最后看到别人的代码,又没发现什么数据问题。后来才知道,每次访问结束后要释放内存。这又让我加深对c++中类的构造函数和析构函数的理解。确实佩服c++的优点。#include//#include#includeusing namespace std;原创 2013-06-17 20:30:09 · 803 阅读 · 0 评论 -
poj_1088 记忆搜索
题目连接中文字,题意就不必过多解释。也许是以前做了最长上升子序列,感觉这题有点类似。这不是二维的吗,其实这题不然。这条路径可以转弯,可以想到用搜索。单独的搜索还不够,我们必须要用保存每个位置的最长路径,这样只要找出最大的就可以了,所以这可以用dp+DFS实现了。代码:#include#include#include#define max(a,b) a>b?a:busing原创 2013-07-13 10:54:09 · 775 阅读 · 0 评论 -
HDU-1421 搬寝室-dp
中文题,题意不用解释了。分析: 用dp[i][j] 表示i个物品分成j组的最小代价。(这个很关键)做dp题第一步就是,用一个dp数组表示相应问题的含义。这个做好了,写状态方程就容易一些。根据题意: 当 i==2*j状态方程为: dp[i][j]=dp[i-1][j]+(a[i]-a[i-1])^2 说明:a[]中的数据是经过从小到大排序的。理论:原创 2013-07-15 11:29:00 · 693 阅读 · 0 评论 -
HDU-1372 Knight Moves (BFS)
题意: 就是国际象棋中马,从某一坐标到另一个坐标的最小步数(走"日"子格).好久没做搜索题了,估计也忘得差不多了,今天到oj上来涮写基础题。幸好这题简单,一下就A了。#include#include#includeusing namespace std;struct node{ int x,y,s;};int visit[8][9];int x_add[8]={-2,-原创 2013-07-17 15:10:47 · 608 阅读 · 0 评论 -
HDU-1142 最短路(spfa)
题目连接题意: 办公室(起点)的编号为1,家(目的地)编号为2。给你一些编号之间的距离。问你,若当前所在的位置A,与B所能到达目的地的最短路径远些,那么就可从A走到B,那么满足这样的条件,有多少条路径。分析:根据题意,要判断能否可以走,必须知道当前点到目的地的最短距离,那么,我们只要从目的地出发,搜索最短路就可以了。(最好不要用dijkstra).然后,在进行记忆搜索就行了。原创 2013-07-18 09:21:40 · 740 阅读 · 0 评论 -
poj1925-Spiderman(dp)
题目连接题意: 蜘蛛侠从他最初所在的位置,到西塔,要经过一些高楼。而蜘蛛侠是从他所在的位置最高处出发,发出蛛丝粘在另一个楼的最高处,像荡秋千一样前行,它最远只能荡到对应的高度。如果荡到地面就不能再前行了。问你他达到西塔最小发出的蛛丝的次数。分析:自己不会!看下学长的。点击打开链接自己分析了一些: 根据题意。“蜘蛛哥”荡到的高度都等于第一个位置的高度。那么,问题原创 2013-07-18 19:43:16 · 732 阅读 · 0 评论 -
poj1698-网络流,(Ek)和(Dinic)算法。
题目连接开始学习网络流了,刚开就做这道题,确实不知道这么建图。发现网络流建图很重要,图建好了,问题就好解决了,这题确实建图有难度。原创 2013-07-19 21:38:54 · 803 阅读 · 0 评论 -
poj1459-Dinic算法
题目连接题目废话真多!题目的意思是: 有n个发电站,np个消费点,nc个转站点,m条线缆。问你输出的最大电量。输入说明: 前面四个分别表示:发电站的个数,消费点的个数,转站点个数,和线缆数。接下来前m是线缆连接的点数(1,0)代表线缆的两个连接点,再就是n个消费的位置(i)和需求。最后就是转站点的位置(i)和最大流通量。分析:此题是一个模板题,用dinic算法就可以A了原创 2013-07-20 17:13:00 · 783 阅读 · 0 评论 -
HDU-1565,1569 最大点权独立集(网络流)
题目连接HDU 1565和1569同属一个问题:最大点权独立集。这是一个二分图最大点权独立集,就是找出图中一些点,使得这些点之间没有变相连,这些点的权值之和最大。独立集与覆盖集是互补的,求最大点独立集可以转化为最小点权覆盖集(最小点权支配集),最小点权覆盖集问题可以转化为最小割问题。 结论: 最大点权独立集=所以点权-最小点权覆盖集=所有点权-最小割集=所有点权-网络最大流。原创 2013-07-22 21:44:26 · 1073 阅读 · 0 评论 -
HDU-1251,字典树
一道典型的字典树问题。字典树有叫前缀数,这题不用它才怪。字典树很简单,三个基本的操作,建立字典树,插入,查询。知道怎么建和用,就可以A了。#include#includeusing namespace std;struct tire{ int num; tire *next[26]; tire(){ num=0; memset(next,0,sizeof(next)原创 2013-07-23 20:07:31 · 670 阅读 · 0 评论 -
HDU-1262素数对
水题一个:先打印素数表,然后去中,往两边一次选,就可以了,主意可以认为相同的两个素之和等于偶数,比如34=17+17。先前没注意这个WA。#include#includeint p[10010]; void get() //打印素数 { p[1]=1; for (int i = 4; i <= 10010; i += 2) { p[i] = 1;原创 2013-07-23 21:10:02 · 863 阅读 · 0 评论 -
HDU-1075 tire
题目连接这题很有意思。分析一下我的解题思路:先把字符串插入到字典树中,在最后一个字符中开辟一个空间,来存放与它相对应的字符串,这样就可以出来,有公共前缀的字符了和字符长短不一的情况,所以这样操作很方便了。代码分析见注释:(思路很简单)#include#include#includestruct tire{ char *ch; tire *next[26]; tire()原创 2013-07-26 10:56:24 · 769 阅读 · 0 评论 -
POJ-2653 Pick-up sticks(线段相交)
题意:一次投放一条木棍,问投放n次夹在上面的木棍有多小,并按顺序输出。按顺序判断线段相交,水题一个。代码:#include#define eps 1e-8using namespace std;struct node{ double x,y;}point[400005];int rec[1005];int cnt;double Judge(node a,node原创 2013-08-19 21:30:26 · 674 阅读 · 0 评论 -
POJ-1556 线段相交的判断与最短路(几何+图论)
题意:在10*10的房间里,有些墙,问你从源点(0,5)到对面的点(10,5)的最短路,不能穿过墙。分析:或许看到了最短路,这题大概就有思路了,到我还是有点疑问,”为什么最短的路一定要从墙的端点过去,有没有存在一条路径从某一点(不在这些点)使它能直接到达目的地“?而这些点是有可能的。但我听别人说过端点就行了,我也不再去追究了。如果是过端点,那就好办了,由于点不多,枚举所以可能的原创 2013-08-19 16:12:24 · 751 阅读 · 0 评论 -
HDU-4651 整数分解(生成函数)
题目连接题意:将数字n分解,求p(n)得个数。听说很多人都在看这个:点击打开链接我也不多说了:#include#define mod 1000000007__int64 f[100005];int w[100005];int main(){ int p=1,t,n; w[0]=0; for(int i=1;w[p-1]<=100000;i++){ w[p++]=原创 2013-08-07 10:25:27 · 805 阅读 · 0 评论 -
HDU 4648 magic pen
题意:去掉连续的数,使得它们的总和mod一个数不变。分析:模(m)一个数不变,在某些连续数字会存在能被m整除。除掉这些数,对余数是没任何影响的。故可以转化为:在n个数中,取出连续的的数使得它们的和能被m整除,求最多可以去多小个。这题和最大连续子序类似。于是设有:s[i]表示前i个数的总和。那么,要求得的是:(s[j]-s[i-1])%m==0 的条件下。求j-i+1的最大值(i到j相隔最远)。原创 2013-08-07 11:37:02 · 728 阅读 · 0 评论 -
poj 3304-Segments 线段相交的判断
题目连接题意:有n条线,是否存在一条直线使得它们在这条直线上的投影至少有一个公共交点。题意可以转化为:去任意两个点组成的线段与所有的线段相交。分析:判断两线段是否相加:可以用向量法。如果两直线相加则必定有一条线段的两个端点位与另一线段的两侧,那就有: 设p1p2 ,q1q2两线段相交:(p1-q1)X(q1-q2)*(p2-q1)X(q1-q2)>=0,注意’X‘是叉积,原创 2013-08-17 19:55:25 · 598 阅读 · 0 评论 -
POJ-1269 直线相交的判断及交点
题意:给了两个线段的两个端点的坐标。求他们相交的类型,如果正规相交并求出交点。分析:用点叉积,可以判断线段的相交类型(平行,共线,相交).大概是: 如果相交:设交点:p0(x0,y0),根据交点在两个线段上有方程: (p1-p0)X(p2-p0)=0; (p3-p0)X(p4-p0)=0;展开就行了。看代码就知道了:#include#includeu原创 2013-08-18 11:15:46 · 756 阅读 · 0 评论 -
POJ-1696 极坐标排序
先不会,后来看了discus才知道,用极坐标排序,换句话说,按着偏转的角度从小到大,相同的按距离从小到大。最后形成的路线是一个螺旋形的折线。#include#includeusing namespace std;struct node { int id,x,y;}p[105];node rec[105];int pos,cnt;int Judge(node a,nod原创 2013-08-20 14:02:38 · 787 阅读 · 0 评论