自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 hdu 5724chess 博弈

题目大意:有一个n*20的棋盘,每一行有若干个棋子,每个棋子可以移动到它右边离它最近第一个空格里,两个人轮流移动,直到有一方不能移动为输。问是否存在先手必胜策略。分析:棋盘的各个行之间是相互独立的,预处理出0~(1#include #include #include #include#includeusing namespace std;int n;int sg[1100

2016-08-04 09:53:21 500

原创 hdu4003 树形dp+分组背包

题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4003     题意:给定一棵n个结点的树及树根,树的每条路径有一个权值,现在树根上有k个机器人,用这k个机器人遍历这棵树,求机器人走的权值之和的最小值。     树形dp的题目还是做的太少了。     我们用f[i][j]表示在以i为根的子树里有j个机器人遍历这棵子树权值之和的最小值,特

2016-07-15 15:27:43 422

原创 hdu 4000 树状数组

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4000   题意大致为:给一个1-n的序列,求有序数对(x,y,z)其中x   通过树状数组可以得到a[i]的后面含有的大于a[i]的数的个数,假设个数为high,那么有序数对(x,y,z)其中(x  对于一个数y,x#include #include #include using

2016-07-13 20:44:27 365

原创 树的直径

树的直径是指树的最长简单路。求法: 两遍BFS :先任选一个起点BFS找到最长路的终点,再从终点进行BFS,则第二次BFS找到的最长路即为树的直径;原理: 设起点为u,第一次BFS找到的终点v一定是树的直径的一个端点证明: 1) 如果u 是直径上的点,则v显然是直径的终点(因为如果v不是的话,则必定存在另一个点w使得u到w的距离更长,则于BFS找到了v矛盾)2) 如果u不是直径上的点,

2015-10-18 21:50:10 474

原创 poj 3041 构图+最小点覆盖

题意是草地上有若干个泥泞的地方,可以用木板覆盖一行或者一列,求最少需要多少木板。    这个题的关键在于构图,我们把方格的每一行看成一个结点,每一列看成一个结点,那么容易的看出这是一个二分图,我们在有泥泞的地方连一条边,比如在点i,j处有泥泞,那就在i,j两点连一条边。那么可以容易的看成题目就变成了求二分图的最小点覆盖的问题。代码如下:#include #include #includ

2015-08-03 13:38:55 449

原创 CodeForces 407B DP

看到题意要模100000007时就知道这个题要么有规律,要么用DP做,注意到1    我们用f[i]表示第一次走到该点时所用的步数,由于1    一个值得注意的地方是:由于DP方程中有减法操作,所以最后得到的结果可能是负数,此时,我们要将它加上若干个1000000007使其变成正数。#include #include using namespace std;#define M

2015-08-02 20:49:33 627

原创 poj 2528 线段树+离散化+有颜色的区间覆盖

区间覆盖,和一般的区间覆盖问题的区别是每个覆盖的区间是有颜色的,最后要输出可见的颜色个数。对于每个区间操作,我们可以采用懒标记的思想,等到有其他区间覆盖过来时,将该区间的颜色向下传递。具体见代码。#include #include #include using namespace std;struct node{ int l,r;};node a[10002];i

2015-08-02 19:39:35 687

原创 poj 3468 线段树+懒标记

简单的线段树区间求和问题,每次改变区间值得时候采用懒标记的操作,等到下次经过这个区间的时候再将懒标记向下传递。#include #include using namespace std;int n,q;int a[100005];long long sum[500005],lazy[500005];void build(int l,int r,int k){ lazy[

2015-08-02 19:29:46 460

原创 CodeForces 19D 离散化+线段树+set

题意给出三种操作1.add x y将点(x,y)加入坐标系,2.remove x y将x y移出坐标系,3.find x y找到坐标系中在(x,y)的右上方且最近的点。    我们首先记录下每一步操作,进行离线处理。将横坐标进行离散化,这样的话我们可以利用lower_bound找到x对应离散化后的位置pos,对于每一个位置pos我们建立一个set,add操作时,我们将set中加入y即x[pos

2015-08-02 10:05:49 681

原创 hdu 1542 扫描线+线段树求矩阵面积并

这几天想啃啃树,无意中找到了这个题,一方面练习一下线段树,另一方面学习一下离散化和扫描线的技巧。      首先,离散化是必要的,因为x,y      显然,离散化的数据不会有重复,这里要介绍一个函数unique,如果现在有一个长度为n的数组unique(a,a+n)返回一个迭代器(也就是指针),它的作用是将a数组中相同的元素都只出现一次,unique(a,a+n)-a就是a中不相同元素的

2015-08-01 19:54:26 1809

原创 网络流初步

最大流问题:如下图所示,有一个管道系统,源点是1,汇点是4,顶点之间的边表示有一条容量为权值的管道。问汇点可以接受的最大流量。这就是一个最大流问题。  流网络:假设G(V,E) 是一个有限的有向图,它的每条边(u,v)∈E都有一个非负值实数的容量c(u,v) 。如果(u,v)不属于E,我们假设c(u,v) = 0 。我们区别两个顶点:一个源点s和一个汇点t。一道网络流是一个对于

2015-07-29 19:19:03 509

原创 hdu 1029 Ignatius and the Princess IV

这倒题挺简单的,容易想到的一个办法是直接排序做,但是网上有一种更加巧妙的做法:      由于所求的数的个数大于等于(n+1)/2,所以所求数出现的次数减去其他数出现的次数的差大于等于1.我们先假设读入的第一个数是所求数,它出现的次数是1,然后依次读入数据,每当读入数据和当前数相同时,出现的次数加一否则减一,当出现的次数减为0的时候,这个数就一定不可能是所求的数,此时,将当前的数作为所求数进行

2015-07-29 15:13:58 284

原创 hdu 1532 网络流

这道题算是网络流最基础的一道题了吧,我是直接用的EK算法做的,直接套用模板就好了。  有一定值得注意的就是,如果数据有重边的话,边的容量是读入的这条边的容量之和。#include #include #include #include #include #include using namespace std;int n,m; //n个顶点,m

2015-07-29 10:29:13 403

原创 hdu 1028 母函数

这道题比较简单,可以说是母函数的模板题,直接套用模板就可以解了。#include #include using namespace std;int n;int main(){ while (scanf("%d",&n)!=EOF) { int c1[150],c2[150]; for (int i=0;i<=n;i++)

2015-07-29 09:03:51 472

转载 母函数及其应用

转自http://blog.csdn.net/ydykl/article/details/6655142网上找的一篇讲组合数学的文章,讲的很不错  先来说一说母函数,今天是第一次学。杭电关于母函数的PPT感觉不错,挺适合入门看看的。什么是母函数?对于序列a0,a1,a2,…构造一函数:G(x)=a0+a1*x+a2*x^2+...G(x)就是序列a0,a

2015-07-28 15:59:13 2360

原创 hdu 1027 康托展开求全排列

{1,2,3,4,...,n}表示1,2,3,...,n的排列如 {1,2,3} 按从小到大排列一共6个。123 132 213 231 312 321 。代表的数字 1 2 3 4 5 6 也就是把10进制数与一个排列对应起来。他们间的对应关系可由康托展开来找到。如我想知道321是{1,2,3}中第几个小的数可以这样考虑 :第一位是3,当第一位的数小于3时,那排列

2015-07-28 15:13:11 568

原创 二分图的最大匹配

首先,介绍一些概念:          二分图:二分图又称作二部图,是图论中的一种特殊模型。设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。下图就是一个二分图:

2015-07-27 16:35:13 369

原创 hdu 1150 最小点覆盖

题意大致是:有AB两台机器,A机器有n个模式,B机器有m个模式,k个任务,每个任务可以由AB其中一台机器完成,但需要不同的模式。机器每转换一次模式就要重启一次,机器初始时的模式是0,求重启的最小次数。     我们首先将AB的不同模式看作一个二分图,对于每一个任务i,如果它可以由A机器的j模式或者B机器的k模式完成,就在j,k之间连一条边,那么,我们只需要找到最少的点,使这些点可以覆盖所有的边

2015-07-27 15:21:26 425

原创 hdu 1026 BFS+优先队列

初看这道题就有一种感觉:这道题是搜索,但是普通的搜索绝对会TLE,但是又实在想不到什么好的方法做。百度了一下解题报告才知道这道题要加上优先队列的优化,先从时间小的结点开始扩展,这样的话保证每个结点只被搜索一次,并且被搜索到的时候对于这个结点来说,时间是最少的,所以我们只需扩展到右下角就停止搜索,这样的话时间复杂度就可以接受了。     这道题由于要输出路径,所以采用一个数组标记,最后用递归的方

2015-07-25 21:55:04 439

原创 STL中栈、队列和优先队列的使用

STL = Standard Template Library,即标准模板库,STL可分为容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors)六个部分。      其中,容器分为三类:序列式容器,容器适配器和关联式容器。      这里要说的栈、队列和优先队列属于容

2015-07-24 20:48:49 765 1

原创 hdu 1025 二分法求LIS

题目给出两个序列,两个序列间有边相连,我们要选出不交叉的边,使得所选的边最多     我们发现,如果我们对其中一个序列从小到大排序的话,这个问题就变成了求另一个序列的最长上升子序列的问题。     由于这个题目的数据比较大,一般的求最长上升子序列的方法是n方的,显然不能满足题目的要求,我们建立一个数组g,g[i]表示长度为i的上升子序列最后一个数的最小值,那么显然g数组是严格单调的,确切的

2015-07-24 19:54:31 488

原创 hdu 1269 迷宫城堡

根据题意,容易看出,这道题就是要求判断该图是否强连通,即只有一个强连通分量,这样的话,我们直接对图运用Tarjan算法,求出图中强连通分量的个数,只有一个强连通分量就说明该图强连通,否则该图不强连通。    这道题算是Tarjan 的模板题#include #include #include #include #include using namespace std;str

2015-07-23 09:55:04 334

原创 有向图的强连通分量(SCC)

在有向图G 中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G 的每两个顶点都强连通,称G 是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达,{5},{6}也分别是两

2015-07-22 21:32:18 1025

原创 2-SAT问题

给定一个由N个bool值组成的序列A,给出一些限定关系,确定序列中每个元素的值,使其满足所有限制关系。这个称为SAT关系。特别的,如果每种关系中最多只对两个元素进行限制,则称为2-SAT问题,即二元可满足性问题。由于在2-SAT问题中,最多只对两个元素进行限制,所以可能的限制关系共有11种:A[x]NOT A[x]A[x] AND A[y]A[x] AND NOT A[y]

2015-07-22 19:29:27 382

原创 hdu 1814 Peaceful Commission (2-SAT)

给定一个由N个bool值组成的序列A,给出一些限定关系,确定序列中每个元素的值,使其满足所有限制关系。这个称为SAT关系。特别的,如果每种关系中最多只对两个元素进行限制,则称为2-SAT问题,即二元可满足性问题显然这个题属于2-SAT问题,直接暴力枚举,对每个结点进行dfs染色,如果我们将i染成红色,那么就将i‘染成蓝色,如果存在i的后继j是蓝色,那么这种方法是不可行的,回溯,将i’染

2015-07-22 19:17:22 504

原创 hdu 1024 Max Sum Plus Plus(最大m子段和)

这道题很容易看出来是动态规划  我们用f[i][j]表示前j个数,分成i段,并且使用第j个数所能达到的最大值,那么我们可以得到状态转移:  ①f[i][j]=f[i][j-1]+a[j],前j-1个数分成i段,由于第j-1个数在这i段里,所以我们可以把第j个数放到第i段  ②f[i][j]=max(f[i-1][k]])+a[j],其中i-1  综上所述,我们可以得到这道题的状态转

2015-07-21 21:25:01 563

原创 hdu 1023 Train Problem II (卡特兰数)

卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列令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)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2         h(3)=h(0)

2015-07-21 17:26:51 345

原创 hdu 1022 Train Problem I

这道题比较简单,直接建立一个栈,模拟火车的进出过程就好,值得注意的一点是,栈顶的火车可以随时出栈,而不必等到所有火车都进完。通过这个问题正好学习一下C++ STL中栈的使用:使用STL中的栈要加入头文件#include using namespace std;栈的定义是模板类 template >栈的操作有:empty()   栈为空时返回真pop()      

2015-07-21 15:25:21 369

原创 hdu 1019 Least Common Multiple

题意要求n个数的lcm,而对于任意的两个数a,b来说 LCM(a,b)=a*b/gcd(a,b),其中gcd(a,b)是a,b的最大公约数,我们利用这个公式就可以很容易的得出答案PS:一开始我没有处理m=1的情况导致程序超时,这是我自己编程不严谨造成的,下次一定改正。#include #include #include using namespace std;long long

2015-07-21 14:56:23 278

原创 hdu 1018 Big Number

这道题的题意是要求算出n!的位数,由于n网上有一个更简单的方法:  我们假设n!=10^m,那么容易知道m+1的整数部分就是n!的位数,也就是说,我们只需要求出m的值就可以了,  我们对这个式子两边取对数得m=log10(n!)=log10(1)+log10(2)+……+log10(n),这样我们就可以在O(n)的时间复杂度下得出结果。#include #include #in

2015-07-21 11:07:00 274

原创 hdu 1013 Digital Roots

想了想还是把这个题写上来了,虽然是一个水题吧,但是还是有值得注意的地方这个题的关键点在于你能注意到题意上并没有给出数据的大小,也就是说,有可能这题的数据相当的长,这一点值得注意。#include #include #include using namespace std;int main(){ char s[10000]; while (scanf("

2015-07-20 15:07:55 275

原创 hdu 1518 Square

这个题目看起来挺简单的,但是有几点是需要注意的:  ①当所有的木棍长度之和不是4的倍数是无论如何也不可能满足题意,直接输出no即可  ②对于一条正方形的边长来说,这条木棍要么现在加入这条边,要么永远不加入这条边,不可能出现,现在不加入这条边过后又加入这条边的情况,这就告诉我们,对于一条边长来说,它的搜索是有顺序的,这一条也算是搜索的一个剪枝。#include #include

2015-07-19 16:45:39 391

原创 hdu 1010 Tempter of the Bone

这个题一开始是想用BFS来做的,可是提交的时候并没有通过,然后仔细想了想,才发现题意要求是在时刻t恰好到达终点,不能提前,这样的话用BFS就不太好操作了,所以最后改用DFS进行操作。  用DFS的话就要用到剪枝,这里有两个剪枝:  ①最优性剪枝:奇偶性剪枝。把原图按照x+y的奇偶性变成01矩阵,那么0和0,1和1之间一定距离偶数步,0和1之间一定距离奇数步,那么我们只需检查终点和当前点以及

2015-07-19 16:43:20 335

原创 hdu 1011 Starship Troopers

这个题是用树形DP的方法做的,所谓树形DP就是在树上做的DP,那么它的状态转移就一定和它的儿子结点有关。这是一个树形背包问题,我们用f[i][j]表示以i为根的子树在有j个士兵的时候最多能够获得的大脑的数量,那么容易得到状态转移方程是:f[i][j]=max(f[i][j],f[i][j-k]+f[son[i][p]][k]);#include #include #include

2015-07-19 16:41:41 318

原创 hdu 1009 FatMouse' Trade

根据题意我们可以知道,FatMouse可以只买仓库里的一部分,而不用全部买完,那么显然,我们利用贪心的思想,找到单位价值最高的仓库,买这个仓库内的东西显然是最划算的,那么我们根据单位价值从大到小排序,线性的扫一遍就好了。#include #include #include using namespace std;struct node{ int a,b; double

2015-07-17 14:28:33 378

原创 hdu 1008 Elevator

简单的模拟题,按照题意直接模拟就好了#include #include using namespace std;int main(){ int n; while (scanf("%d",&n)!=EOF) { if (!n) break; int ans=0,goal,now=0; while (n--)

2015-07-17 14:00:22 454

原创 hdu 1007 Quoit Design

在二维平面上的n个点中,如何快速的找出最近的一对点,就是最近点对问题。    一种简单的想法是暴力枚举每两个点,记录最小距离,显然,时间复杂度为O(n^2)。    在这里介绍一种时间复杂度为O(nlognlogn)的算法。其实,这里用到了分治的思想。将所给平面上n个点的集合S分成两个子集S1和S2,每个子集中约有n/2个点。然后在每个子集中递归地求最接近的点对。在这里,一个关键的

2015-07-17 13:39:26 442

原创 hdu 1016 Prime Ring Problem

简单题,直接dfs即可。#include int n,a[30],f[50],g[30];void print(){ int i; printf("1"); for (i=2;i<=n;i++) printf(" %d",a[i]); printf("\n");}void dfs(int t){ int i; if ((t>n)&&(f[a[n]+1])) {prin

2014-12-14 11:28:08 322

原创 hdu 1004 Let the Balloon Rise

简单题,读入字符串,计数就好,

2014-11-12 22:17:10 413

原创 hdu 1003 Max Sum

简单DP最大连续子序列和

2014-11-12 22:08:44 343

空空如也

空空如也

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

TA关注的人

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