
acm算法
文章平均质量分 85
Puppet__
努力想变得更好
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
摩尔投票法(多数投票法) + LC 多数元素
摩尔投票:主要解决的问题,如何在任意多的候选人中(选票无序),选出获得票数最多的那个。时间复杂度:O(N)空间复杂度:O(1)形象化描述:想象着这样一个画面:会议大厅站满了投票代表,每个都有一个牌子上面写着自己所选的候选人的名字。然后选举意见不合的(所选的候选人不同)两个人,会打一架,并且会同时击倒对方。显而易见,如果一个人拥有的选票比其它所有人加起来的选票还要多的话,这个候选人将会赢得这场“战争”,当混乱结束,最后剩下的那个代表(可能会有多个)将会来自多数人所站的阵营。但是如果所有参加候选人的原创 2021-03-29 12:01:46 · 671 阅读 · 1 评论 -
Kruskal(克鲁斯卡尔) 最小生成树 算法详解+模板
最小生成树在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树。 例如,对于如上图G4所示的连通网可以有多棵权值总和不相同的生成树。 克鲁斯卡尔算法介绍 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路。转载 2017-07-26 15:27:58 · 21937 阅读 · 3 评论 -
memset 赋值
这几天做图论的 最小生成树和最短路 什么的。整了整memset,把我对memset的理解说下吧。 相信大家都会用string.h下的memset 赋值吧。很简单,特别是对于搜索时候 vis数组的赋值,最小生成树和最短路的used数组也不错。但是,都知道memset只能赋0和-1,内部机构是通过按位来实现的。 而这次,来讲一下memset赋大值。我们可以用mems...原创 2017-07-26 17:56:36 · 1123 阅读 · 0 评论 -
gcd (辗转相除) 一般用于求最大公约数 最小公倍数
gcd 很简单并且很好用的一个算法,它缩短了很大的一部分时间。 废话不多说,直接上代码#include <iostream>using namespace std;int gcd(int a,int b) //求最大公约数 当b为0时结束递归{ if(b==0) return a; else return gcd(b,a%b);}int原创 2017-07-28 09:02:04 · 604 阅读 · 0 评论 -
叉积(向量之间的计算)
叉积 平面向量很好计算 例如: a=(x1,y1),b=(x2,y2) 则 a×b=x1*y2-x2*y1; 空间向量 则用行列式则可计算 例如:a =(x1,y1,z1), b=(x2,y2,z2); | i j k | | x1 y1 z1 | | x2 y2 z原创 2017-07-28 09:19:26 · 33226 阅读 · 4 评论 -
极角排序(主要用于凸包问题)
名词释义:在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向)。对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标 极角排序有很多种方法而我认为只要会叉积一个就够了 之前长用atan2来写极角排序但是有些题目对数字精确性要高很多,原创 2017-07-28 09:49:51 · 2569 阅读 · 2 评论 -
凸包 +模板
凸包有很多方法 而这里为只介绍Graham 扫描法 时间复杂度为 O(nlogn) 思路:Graham扫描的思想和Jarris步进法类似,也是先找到凸包上的一个点,然后从那个点开始按逆时针方向逐个找凸包上的点,但它不是利用夹角。 步骤: 1. 把所有点放在二维坐标系中,则纵坐标最小的点一定是凸包上的点,如图中的P0。 2. 把所有点的坐标平移一下,使 P0 作为原点,如上图。 3.原创 2017-07-28 10:46:53 · 496 阅读 · 1 评论 -
pick定理
Pick定理:设以整数点为顶点的多边形的面积为S,多边形内部的整数点数为N,边界上的整数点数为L,则N+1/2*L-1=S;下面给出计算N,L,S的代码: #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <math.h>using namespace std;struc原创 2017-08-04 15:52:01 · 719 阅读 · 0 评论 -
stl pair
因不会大<|故后面所有<|都加了个无意义的|1.作用:pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同。如果一个函数有两个返回值的话,如果是相同类型,就可以用数组返回,如果是不同类型,就可以自己写个struct ,但为了方便就可以使用 c++自带的pair ,返回一个pair,其中带有两个值。除了返回值的应用,在一个对象有多个属性的时候 ,一般自己写一个struct ,如果就是两个原创 2017-08-04 16:15:08 · 383 阅读 · 0 评论 -
bfs和dfs的特点
一、深度优先搜索(dfs)的特点是: (1)深度优先搜索法有递归以及非递归两种设计方法。一般的,当搜索深度较小、问题递归方式比较明显时,用递归方法设计好,它可以使得程序结构更简捷易懂。当数据量较大时,由于系统堆栈容量的限制,递归容易产生溢出,用非递归方法设计比较好。 (2)深度优先搜索方法有广义和狭义两种理解。广义的理解是,只要最新产生的结点(即深度最大的结点)先转载 2017-08-04 17:29:49 · 3134 阅读 · 0 评论 -
给你N个数求其最小公倍数(hdu 1019 Least Common Multiple)
Problem DescriptionThe least common multiple (LCM) of a set of positive integers is the smallest positive integer which is divisible by all the numbers in the set. For example, the LCM of 5, 7 and 15原创 2017-11-06 19:51:34 · 711 阅读 · 0 评论 -
山东省第五届省赛 A题 angry_birds_again_and_again(简单数学 积分问题)
Description The problems called “Angry Birds” and “Angry Birds Again and Again” has been solved by many teams in the series of contest in 2011 Multi-University Training Contest.This time we focus on t原创 2018-01-22 13:54:24 · 375 阅读 · 0 评论 -
Dijkstra(迪杰斯特拉) 最短路+模板
迪杰斯特拉算法介绍迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。 基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。 此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还转载 2017-07-25 18:06:12 · 776 阅读 · 0 评论 -
Floyd(弗洛伊德)算法 详解+模板
弗洛伊德算法介绍和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。基本思想 通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离。 假设图G中顶转载 2017-07-26 14:47:41 · 12990 阅读 · 2 评论 -
HDU 1874 Dijkstra (迪杰斯特拉)(队列及邻接矩阵)
AC代码(1):/*关于三个数组:map数组存的为点边的信息,比如map[1][2]=3,表示1号点和2号点的距离为3dis数组存的为起始点与每个点的最短距离,比如dis[3]=5,表示起始点与3号点最短距离为5visit数组存的为0或者1,1表示已经走过这个点。*/#include <iostream>#include <algorithm>#include <cstdio>#in原创 2017-07-25 17:54:31 · 473 阅读 · 1 评论 -
简单acm题:棋盘覆盖
Description 在一个2k x 2k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。 Input k,dr,dc。k定义如前,dr,dc分别表示特殊方格所在的行号和列号 1= < k ...原创 2018-11-07 08:17:23 · 1099 阅读 · 0 评论 -
划分问题
Description 给定一个正整数的集合A={a1,a2,….,an},是否可以将其分割成两个子集合,使两个子集合的数加起来的和相等。例A = { 1, 3, 8, 4, 10} 可以分割:{1, 8, 4} 及 {3, 10} Input 第一行集合元素个数n n <=300 第二行n个整数 Output 如果能划分成两个集合,输出任意一个子集...原创 2018-10-31 14:56:49 · 3051 阅读 · 0 评论 -
会场安排问题
escription 假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。) 对于给定的k个待安排的活动,计算使用最少会场的时间表。 Input 输入数据的第一行有1 个正整数k(k≤...原创 2018-10-31 09:25:53 · 525 阅读 · 0 评论 -
最大子段和的三种求法
这里注意子段是连续的,子序列是不连续的。(1)暴力求解//最大子段和 暴力 直接三层循环 暴力所有区间 然后找最大的子段和 #include <iostream>#include <algorithm>#include <cstdio>#include <cmath>#include <cstring>#includ...原创 2018-10-31 09:00:58 · 1283 阅读 · 0 评论 -
Poj 2139 Six Degrees of Cowvin Bacon (floyd最短路)
Six Degrees of Cowvin Bacon Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3993Description The cows have been making movies lately, so they are ready原创 2017-07-26 15:03:01 · 493 阅读 · 0 评论 -
树的创建以及先序 中序 后序遍历
根据给定的字符串生成二叉树并前序、中序、后序此二叉树。 Input 给定一字符串,其中#表示空。例:上图输入为HDB#A##C##G#FE### Output 分别输出此二叉树前序、中序和后序。 Sample InputHDB#A##C##G#FE###Sample OutputHDBACGFEBADCHGEFABCDE...原创 2017-07-20 09:59:57 · 434 阅读 · 0 评论 -
最小生成树 Kruskal(克鲁斯卡尔)算法
Description省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。 Input测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后...原创 2017-07-21 16:43:06 · 803 阅读 · 0 评论 -
(poj 2377)Kruskal算法 最大生成树
这道题只是一道模板题,感到唯一的坑点就是n,m容易打错,一定要注意结构体要开到Max(M)+n; 之前便是因为这个地方Runtime Error了两次;顺便注意最后输出的答案 为long long型题目**Description Bessie has been hired to build a cheap internet network among Farmer John’s N (2 <= N原创 2017-07-22 16:07:31 · 7943 阅读 · 0 评论 -
(POJ 1258)Prim算法 最小生成树
Prime 只于顶点有关 基本思想1.清空生成树,任取一个顶点加入生成树2.在那些一个端点在生成树里,另一个端点不在生成树里的边中,选取一条权最小的边,将它和另一个端点加进生成树3.重复步骤2,直到所有的顶点都进入了生成树为止,此时的生成树就是最小生成树Description Farmer John has been elected mayor of his town! One of his c原创 2017-07-22 16:43:11 · 1514 阅读 · 2 评论 -
Prim(普里姆)求小生成树 模板
Prim算法介绍普里姆(Prim)算法,和克鲁斯卡尔算法一样,是用来求加权连通图的最小生成树的算法。基本思想对于图G而言,V是所有顶点的集合;现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T存放G的最小生成树中的边。 从所有uЄU,vЄ(V-U) (V-U表示出去U的所有顶点)的边中选取权值最小的边(u, v),将顶点v加入集合U中,将边(u, v)加入集合T中,如此不断重复,转载 2017-07-25 17:35:57 · 494 阅读 · 0 评论 -
山东省第五届省赛J题 Weighted Median(思维题 sort给结构体排序)
Description For n elements x1, x2, …, xn with positive integer weights w1, w2, …, wn. The weighted median is the element xk satisfying and , S indicates Can you compute the weighted median原创 2018-01-24 12:26:49 · 265 阅读 · 0 评论 -
山东省第五届省赛题 G - Hearthstone II(简单组合数学应用第二类stirling数)
先简单介绍一下stirling数:Stirling数概念Stirling数出现在许多组合枚举问题中。对第一类Stirling数 ,也可记为 。表示将 n 个不同元素构成m个圆排列的数目。同时还分为无符号第一类Stirling数 和带符号第一类Stirling数 。 第二类Stirling数 ,同时可记为 [与第一类的表示有大小写的区别]。其表示将n个不同的元素分成m个集合的方案数。在介原创 2018-01-25 16:48:16 · 632 阅读 · 0 评论 -
第五届省赛题B—Circle (说白了就是规律题)
Description You have been given a circle from 0 to n - 1. If you are currently at x, you will move to (x - 1) mod n or (x + 1) mod n with equal probability. Now we want to know the expected number of原创 2018-01-26 21:55:41 · 370 阅读 · 0 评论 -
树状数组 区间更新(利用了伪线段树) + poj3468题解
废话不多说 先粘代码 以poj3468为例A Simple Problem with IntegersTime Limit: 5000MS Memory Limit: 131072KTotal Submissions: 123915 Accepted: 38431Case Time Limit: 2000MSDescriptionYou have N integers,原创 2018-01-18 17:39:26 · 463 阅读 · 0 评论 -
博弈
序:博弈是信息学和数学试题中常会出现的一种类型,算法灵活多变是其最大特点,而其中有一类试题更是完全无法用常见的博弈树来进行解答。 寻找必败态即为针对此类试题给出一种解题思路。此类问题一般有如下特点:1、博弈模型为两人轮流决策的非合作博弈。即两人轮流进行决策,并且两人都使用最优策略来获取胜利。2、博弈是有限的。即无论两人怎样决策,都会在有限步后决出胜负。3、公平博弈。即两人进行决策所遵循的规则相同。理转载 2018-01-12 11:26:18 · 503 阅读 · 0 评论 -
博弈汇总
**博弈常识汇总**有一种很有意思的游戏,就是有物体若干堆,可所以火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我公民间很古老的一个游戏 ,别看这游戏极其简单,却蕴含着深切的数学道理。下面我们来解析一下要如何才干够取胜。(一)巴什博奕(Bash Game):只有一堆n个物品,两小我轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者获胜。显然,若是n转载 2018-01-12 10:23:23 · 447 阅读 · 0 评论 -
最大子矩阵和
(1)问题描述:给定一个m行n列的整数矩阵A,试求A的一个子矩阵,时期各元素之和为最大。 (2)问题分析: 用二维数组a[1:m][1:n]表示给定的m行n列的整数矩阵。子数组a[i1:i2][j1:j2]表示左上角和右下角行列坐标分别为(i1,j1)和(i2,j2)的子矩阵,其各元素之和记为: 最大子矩阵问题的最优值为。如果用直接枚举的方法解最大子矩阵和问题,需要O(m^2n^2转载 2017-10-16 14:36:04 · 1321 阅读 · 0 评论 -
并查集(以hdu 1232 畅通工程为例)
在讲并查集之前我们先举一个例子。(这个例子是出自别人之手)话说江湖上散落着各式各样的大侠,有上千个之多。他们没有什么正当职业,整天背着剑在外面走来走去,碰到和自己不是一路人的,就免不了要打一架。但大侠们有一个优点就是讲义气,绝对不打自己的朋友。而且他们信奉“朋友的朋友就是我的朋友”,只要是能通过朋友关系串联起来的,不管拐了多少个弯,都认为是自己人。这样一来,江湖上就形成了一个一个的群落,通过两两之原创 2017-11-09 13:07:52 · 368 阅读 · 0 评论 -
各种博弈
一. 巴什博奕(Bash Game):**那么如果我们要报n个数,每次最少报一个,最多报m个,我们可以找到这么一个整数k和r,使n=k*(m+1)+r,代入上面的例子我们就可以知道,如果r=0,那么先手必败;否则,先手必胜。巴什博奕:只有一堆n个物品,两个人轮流从中取物,规定每次最少取一个,最多取m个,最后取光者为胜。 代码如下:#include <iostream> using namesp原创 2017-10-29 13:29:55 · 731 阅读 · 0 评论 -
威佐夫博弈常见题型和理解
下面来看看威佐夫博弈常见的三类问题:1)给你一个局面,让你求是先手输赢。 有了上面的分析,那么这个问题应该不难解决。首先求出差值,差值 * 1.618 == 最小值 的话后手赢,否则先手赢。(注意这里的1.618最好是用上面式子计算出来的,否则精 度要求高的题目会错)2)给你一个局面,让你求先手输赢,假设先手赢的话输出他第一次的取法。 首先讨论在两边同时取的情况,很明显两边同时取原创 2017-10-29 13:13:41 · 680 阅读 · 0 评论 -
线段树模板
#include <cstdio>#include <algorithm>#include <iostream>using namespace std;int n,m,p;//n个结点,m种操作,操作为pint x,y;//查询的值x或者单点修改x的值加上yint a,b;//区间查询时使用的区间a,b;int ans;//存储答案struct node{ int left转载 2017-08-10 10:43:55 · 266 阅读 · 0 评论 -
最大连续子序列
Problem Description 给定K个整数的序列{ N1, N2, …, NK },其任意连续子序列可表示为{ Ni, Ni+1, …, Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个, 例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和 为20。 在今年的数据结构考原创 2017-08-09 08:23:15 · 362 阅读 · 0 评论 -
最长上升子序列 最长公共子序列
最长上升子序列为DP问题,所以我们可以用DP来解决。它有两种算法,首先介绍一下 时间复杂度为O(n^2): 递推关系:dp[i]={1,d[j]+1|j<i且aj<ai} dp[]:=以ai为末尾的最长上升子序列的长度 而以ai结尾的上升子序列是: (1)只包含ai的子序列 (2)在满足j<i并且aj<ai的以aj为结尾的上升子列末尾,追加上ai后得到的子序列。 我们依次遍历整个序列,原创 2017-08-07 16:55:59 · 792 阅读 · 0 评论 -
多重背包模板
题目:有N种物品和一个容量为V的背包。第i种物品最多有num[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 将原数量为k的物品拆分成若干组,每一组可看成一件新的物品,其价值和重量为该组中所有物品的价值重量的总和,每组物品包含的原物品个数分别为:1、2、4…k-2^c+1,其中c为使k-2^c+1大于0的最大整数。这样就将原创 2017-08-07 17:19:39 · 495 阅读 · 0 评论 -
模拟退火算法(SA算法)
模拟退火算法是一种随机算法,并不一定能找到全局的最优解,可以比较快的找到问题的近似最优解。 如果参数设置得当,模拟退火算法搜索效率比穷举法要高。一.在开始进入正题前,先简单介绍一下物理上的固体退火原理在热力学上,退火(annealing)现象指物体逐渐降温的物理现象,温度愈低,物体的能量状态会低;够低后,液体开始冷凝与结晶,在结晶状态时,系统的能量状态最低。大自然在缓慢降温(亦即,退火...原创 2018-02-26 21:43:18 · 13698 阅读 · 0 评论