10 2015 档案
摘要:c++11还增加了许多有用的特性,比如:1. 委托构造函数如果一个类含有很多构造函数,这些构造函数有一些重复的地方,比如:class A{public: A(){}; A(int a){ a_ = a; }; A(int a, int b){ a_...
阅读全文
摘要:string和数值类型转换c++11提供了to_string方法,可以方便的将各种数值类型转换为 字符串类型: std::string to_string(int value); std::string to_string(long int value); std::string ...
阅读全文
摘要:c++11提供了日期时间相关的库 chrono,通过chrono库可以很方便的处理日期和时间。1. 记录时间长度的duration template> class Duration; //第一个模板参数Rep是一个数值类型,表示时钟数的类型;第二个模板参数是一个默认模板参数 std...
阅读全文
摘要:c++11提供了丰富的时间和线程操作函数,比如 std::this_thread::sleep, std::chrono::seconds等。可以利用这些来很方便的实现一个定时器。定时器要求在固定的时间异步执行一个操作,比如boost库中的boost::asio::deadline_timer,以及...
阅读全文
摘要:题目大意给定平面上N个矩形的位置(给出矩形的左下角和右上角的坐标),这些矩形有些会有重叠,且重叠只会出现矩形的边重合全部或部分,矩形的顶点重合,而不会出现一个矩形的顶点位于另一个矩形的内部。求出所有不重叠的矩形的个数。题目分析将每个矩形分成4个点,记录每个点所属的矩形id,对4*N个点进行按照x坐标...
阅读全文
摘要: 给定N(N<=35)个数字,每个数字都<= 2^15. 其中一个或多个数字加和可以得到s,求出s的绝对值的最小值,并给出当s取绝对值最小值时,需要加和的数字的个数。 需要枚举集合的所有情况,2^35,会超时。考虑使用折半枚举的方法,考虑前 N/2个数字构成的集合S1,在S1中进行所有
阅读全文
摘要:题目大意N头牛,M个谷仓,每个牛c都有它喜欢的若干个谷仓,现在要将这N头牛安排进谷仓,使得每个牛都位于它喜欢的谷仓,而每个谷仓只能有一头牛。求安排的方案总数。N, M #include#include #include using namespace std;#define MAX_N 22vect...
阅读全文
摘要:题目大意给定一条直线,长度为L 表示区间[0, L]。在直线上开始放置N个人,每个人有一个初始位置pos(用到直线上端点0的距离表示)和初始方向dir('p' 或 'P' 表示向端点L行走, 'n'或'N'表示向端点0行走),然后所有的人都开始沿着自己的方向用相同的速度v行走,若走到端点0或端点L,...
阅读全文
摘要:题目大意有20个碗排成一排,有些碗口朝上,有些碗口朝下。每次可以反转其中的一个碗,但是在反转该碗时,该碗左右两边的碗也跟着被反转(如果该碗为边界上的碗,则只有一侧的碗被反转)。求最少需要反转几次,可以使得所有碗口均朝上。题目分析类似黑白染色问题(将一个格子染色,其上下左右四个格子也被染成分别相反的颜...
阅读全文
摘要:题目大意给定一个数字N,N可能由1个或多个连续的素数求和得到,比如41 = 2+3+5+7+11+13, 41 = 11+13+17, 41 = 41。求出对于N,所有可能的组合形式。题目分析先求出所有可能构成加数的素数,使用埃氏筛选法。然后求出所有的可能形式,由于所选择的是一个连续的区间,可以使用...
阅读全文
摘要:题目大意有N个节点以及连接的P个无向边,现在要通过这P条边从1号节点连接到N号节点。若无法连接成功,则返回-1;若能够连接成功,那么其中用到了L条边,这L条边中有K条边可以免费,L-K条边不能免费,求出不能免费的边的最大长度。题目分析判断能否到达,可以通过BFS搜索路径,若不能到达,返回-1;若能到...
阅读全文
摘要:题目大意给定N个数,这些数字两两求差构成C(N,2)(即N*(N-1)/2)个数值,求这C(N,2)个数的中位数。N #includeusing namespace std;#define MAX_N 100005int an[MAX_N];int DiffKLessThanHalf(int n, ...
阅读全文
摘要:题目大意给定区间[0,L],在区间内给定N个数,加上区间的端点总共N+2个值。这N+2个数相邻的两个数之间有一个差值delta[i],现在可以从除去端点之外的这N个数中删除M个,使得剩余的N+2-M个数相邻数的最小差值最大。求这N+2-M个数相邻数的最小差值的最大值。题目分析典型的最大化最小值问题,...
阅读全文
摘要:学校校园网的网络连接有免费连接和收费连接两种类型,可想而知收费连接浏览体验更佳,比如可以访问更多的网站。之前收费地址只能开通包月服务才可使用,后来居然有了每个月60小时的免费使用收费地址的优惠。但是,一旦连接了收费地址而忘记及时断开,60小时会很快用完。 为了节约收费地址的使用时间,采用如下方案:每
阅读全文
摘要:差分约束系统如果一个系统由n个变量和m个不等式组成,形如 Xj - Xi j] >= min_dist[j]可以得到Xi + Bk >= Xj, 这和初始给定的约束条件Xj - Xi = k可以转换为 Xi - Xj = k(即Xi - Xj k,差分约束系统只针对 >= 或者 =, <=.参考...
阅读全文
摘要:1. 辗转相除法/欧几里得算法用辗转相除法求两个整数的最大公约数。记 gcd(a,b) 为两个数a和b的最大公约数。辗转相除法的理论依据为: gcd(a, b) = gcd(b, a % b).因为设t为a和b的最大公约数,则 a = mt, b = nt, m和n互斥,a = k*b + a%b,...
阅读全文
摘要:拓扑排序 对于一个有向无环图,我们可以这样确定一个图中顶点的顺序: 对于所有的u、v,若存在有向路径u-->v,则在最后的顶点排序中u就位于v之前。这样确定的顺序就是一个图的拓扑排序。 拓扑排序的特点: (1)所有可以到达顶点v的顶点u都位于顶点v之前; (2)所有从顶点v可以到达的顶点u都位于顶点
阅读全文
摘要:1. 二分图 二分图是指在一个图中,将点集分为X和Y两个集合,使得图的边的两个端点总是分别落在X和Y上,不会有X中的点连向X中的点,也不会有Y中的点连接到Y中的点。 图1 如上图所示,顶点2,3,4构成集合X,顶点5,6,7构成集合Y。只存在X连接到Y的边或者Y连接到X的边。 2. 匹配 匹配是图中
阅读全文
摘要:求图中节点的单源最短路径可以使用Dijkstra,BellmanFord, SPFA算法,而对于有向无环图DAG来说,可以通过简单的动态规划来进行求解。DAG的独特之处是所有节点可以线性化(拓扑序列),使得所有边保持从左到右的方向,如下图:思路动态规划的递推需要一个线性或者树形的顺序,对于DAG,我...
阅读全文
摘要:题目大意一个nxm的地图,地图上的横纵交错成nxm个交叉点,其中有k个交叉点为房间,k个交叉点为k个小人的初始位置。小人可以在地图上沿着水平或垂直方向行走,每走一步的代价为1。求这k个小人分别到达k个不同的房间,所花费的总代价的最小值。题目分析k个小人走到k个房间节点,走出k条不同的路径,形成一个网...
阅读全文
摘要:题目大意一个图上有N个顶点,从1到N标号,顶点之间存在一些无向边,边有长度,要求从顶点1走到顶点N,再从顶点N走回顶点1,其中不必要经过每个顶点,但是要求走的路径上的边只能经过一次。求出从1--->N-->1的路径的长度最小值。题目分析每条无向边最多只能走一次,可以视为这些边的容量只有1。题目中要求...
阅读全文
摘要:最小费用最大流通过EK,Dinic,ISAP算法可以得到网络流图中的最大流,一个网络流图中最大流的流量max_flow是唯一的,但是达到最大流量max_flow时每条边上的流量分配f是不唯一的。如果给网络流图中的每条边都设置一个费用cost,表示单位流量流经该边时会导致花费cost。那么在这些流量均...
阅读全文
摘要:题目大意一个mxn的矩阵,给出矩阵中每一行的和sh[1,2...m]以及每一列的数字的和目sv[1,2...n],以及矩阵中的一些元素的范围限制,比如a[1][2] > 1, a[2][3] #include#include#includeusing namespace std;#define MA...
阅读全文
摘要:有上下界的网络最大流是指在网络流图中两点之间的路径上的流量Flow必须在一个范围之内。用[Bi,Ci]表示路径i,说明路径i上的流量Flow(i)大于等于Bi且小于等于Ci. 有上下界的网络流问题可以分为四类: 1. 无源汇网络可行流 2. 有源汇网络可行流 3. 有源汇网络最大流 4. 有源汇网络
阅读全文
摘要:题目大意生产电脑的工厂将一台电脑分成P个部件来进行流水线生产组装,有N个生产车间,每个车间可以将一个半成品电脑添加某些部件,使之成为另一个半成品电脑或者成为一台完好的电脑,且每个车间有一个效率,即在单位时间内可以将K个半成品组装为另外K个半成品或者完好的电脑。每个车间在组装完成之后,都将组装后的半成...
阅读全文
摘要:题目大意有K台挤奶机和C头奶牛,都被视为物体,这K+C个物体之间存在路径。给出一个 (K+C)x(K+C) 的矩阵A,A[i][j]表示物体i和物体j之间的距离,有些物体之间可能没有直接通路。每台挤奶机可以容纳m头奶牛去挤奶,且每个奶牛仅可以去往一台挤奶机。现在安排这C头奶牛去挤奶,每头奶牛会去往某...
阅读全文
摘要:网络最大流是指在一个网络流图中可以从源点流到汇点的最大的流量。求解网络最大流的常用算法可以分为增广路径算法和预推进算法。其中,预推进算法的理论复杂度优于增广路径算法,但是编码复杂度过高,且效率优势在很多时候并不是很明显,因此,经常使用的算法为增广路径算法。 增广路径算法主要有Fold-Fulkers
阅读全文
摘要:题目大意N个点的有向图中,定义“好点”为:从该点v出发可以到达的所有点u,均有一条路径使得u可达v。求出图中所有的“好点”,并按照顺序从小到大输出出来。题目分析图存在多个强连通分支,强连通分支内的所有点的行为可以视为一个点的行为:若强连通分支可以到达其他强连通分支,则该强连通分支内的所有点均可以到达...
阅读全文
摘要:题目大意给定N个点,他们之间用一些双向边连通,使得这N个点两两相互可达。但是其中某些双向边为桥,这样若断开这些桥,则整个图就无法做到点之间两两可达。现在可以添加若干条双向边,使得断开图中的任意一条边之后,N个点之间仍然两两可达。求最少需要添加几条边?题目分析将这N个点视为无向连通图的顶点,然后找出其...
阅读全文
摘要:题目大意有N个学校,这些学校之间用一些单向边连接,若学校A连接到学校B(B不一定连接到A),那么给学校A发一套软件,则学校B也可以获得。现给出学校之间的连接关系,求出至少给几个学校分发软件,才能使得所有的学校均可以获得软件;以及,至少需要添加几条单向边连接学校,才能使得给这些学校中任何一所发软件,其...
阅读全文
摘要:题目大意有N头牛,他们中间有些牛会认为另外一些牛“厉害”,且这种认为会传递,即若牛A认为牛B“厉害”,牛B认为牛C“厉害”,那么牛A也认为牛C“厉害”。现给出一些牛的数对(x, y)表示牛x认为牛y厉害。那么,求出所有的牛都认为该牛“厉害”的牛的个数。题目分析牛之间的关系,形成一个有向图。其中存在一...
阅读全文
摘要:一、强连通分量 在有向图G中,如果任意两个不同的顶点相互可达,则该有向图为强连通的;一个有向图G的极大连通子图称为G的强连通分支;将有向图G的每一条边反向形成的图称为G的转置 Gt. 1.1 有向图的一些定理 有向无环图中唯一出度为0的点,一定可以由任何点出发到达 图中节点的数目为有限多个,而且无环
阅读全文
摘要:最小生成树MST是在一个图中求出一个连接N个点的树,使得树的N-1条边的权值之和最小。求最小生成树有两种方法:1. prim算法 2.kruskal算法prim算法贪心思想,将N个点分为两个集合。V(在最小生成树中的点集合)和S-V(不在最小生成树中的点集合),每次从S-V集合中选取 距离集合V中的...
阅读全文
摘要:题目大意给定N个点的坐标,这N个点之间需要进行通讯。通讯方式可以采用卫星通信或无线通信,若两点之间采用为卫星通信,则两点之间的距离无限制,若采用无线通讯,则两点之间的距离不能大于某个值D。现有s台卫星通信设备可以分配给这N个点,其余的点之间必须使用无线通信。要让这N个点中所有的点都能相互通信,则合理...
阅读全文
摘要:题目大意给定N个点,以及每两个点之间的路径长度,求出一个连接这N个点的方案,使得连接这N个点的总长度最短,求出该总长度。题目分析求最小生成树MST的模板题,直接使用prim算法进行求解。实现(c++)#include#include#include#include#includeusing name...
阅读全文
摘要:最短路在图上求最短路径是一类非常常见的问题,根据源点的数目可以分为 单源最短路径和所有点最短路径;根据边的权值可以分为无负权值边最短路径和有负权值边最短路径。常用算法求图中最短路径的方法主要有:Dijkstra算法: 求单源、无负权值边最短路径BellmanFord算法:求单源、有负权值边,无负权值...
阅读全文
摘要:题目大意N个股票经纪人,每个股票经纪人都会将得到的消息传播给另外一些股票经纪人,传播的速度均不固定,且从A传到B的速度和B传到A的速度不一定相等。给定一个消息,并不一定能够传遍所有的股票经纪人,因为股票经纪人可能形成一座座“孤岛”,使得信息无法送达。现在给定每个股票经纪人能消息传达的其他股票经纪人和...
阅读全文
摘要:题目大意有N种货币,M个兑换点,每个兑换点只能相互兑换两种货币。设兑换点A可以兑换货币C1和C2,给出rate(C1--C2)表示1单位的C1货币可以兑换出的C2货币数目,rate(C2--C1)表示1单位的C2货币可以兑换出的C1货币数目,commision(C1)表示用C1兑换C2的时候兑换点需...
阅读全文
摘要:题目大意N个点,M条双向路径,W条单向路径。从双向路径的一端到另一端所花费时间为正值,从单向路径的源点到终点所花时间为负值。问是否存在一条从A出发,再回到A的回路,满足回到A的时间小于出发时间。题目分析显然为一个求含负权边的图中是否含有负权和回路。采用SPFA算法解决。实现(c++)#include...
阅读全文
摘要:题目大意有N个孩子(Ni1--->i2--->....ik--->N,表示同学i1比同学1最多多x1个糖果,同学i2比同学i1最多多x2个糖果....同学N比同学ik最多多xk+1个糖果; 还存在路径21--->j1-->j2.....-->jk--->N,表示同学j1比同学1最多多y1个糖果,同学...
阅读全文
摘要:题目大意N个节点构成一棵树,每个节点上有一个权重val[i], 从根节点root出发在树上行走,行走的时候只能沿着树枝行进。最多在树上走k步,每第一次到达某个节点j,可以获得val[j]的收益,求从root出发,最多走k步,可以得到的最大收益。题目分析树形结构+ 最优化问题,考虑使用动态规划来解决,...
阅读全文
摘要:题目大意N个节点构成一棵树形结构,在其中若干个节点上放置士兵,与被放置士兵的节点相连的边会被士兵看守。问需要至少在多少个节点上放置士兵,才能使得N-1条边都被看守。题目分析题目描述的结构为树形,且最优化问题,可以考虑使用树形动态规划来解决。将结构按照树根在上,树叶在下的结构进行排列,为了保证无后效性...
阅读全文
摘要:c++11中增加了线程以及线程相关的类,很方便的支持了并发编程。1. 线程线程创建使用std::thread创建线程,提供线程函数或者函数对象即可,并且可以指定线程函数的参数。#includevoid func(int a){ cout void func(){ //do some wo...
阅读全文
摘要:智能指针是存储指向动态分配(堆)对象指针的类,用于生存期控制、能够确保在离开指针所在作用域时,自动正确的销毁动态分配的对象,防止内存泄露。c++11提供了3种智能指针:std::shared_ptr, std::unique_ptr, std::weak_ptr,使用时需要引用头文件。1. shar...
阅读全文