自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 资源 (1)
  • 收藏
  • 关注

原创 GYM 101128H Sheldon Numbers

原题如Description 问区间[x,y]中有多少数的二进制表示是ABAB..AB型或者A型的,其中A是n个1,B是m个0,n, m > 0 Input 两个整数x和y(0Output 输出[x,y]中有多少满足条件的数 Sample Input 1 10 Sample Output 10 思路:先构建模板,像110, 111

2017-03-27 11:52:53 628

转载 从SG函数浅谈解决博弈问题的通法

基于笔者之前对于几种二元零和博弈游戏的介绍,这里将其思想进行简单的提炼,并引出解决这类二元零和博弈游戏的强大工具——SG函数。先来了解一下零和思维,"竞争者此长彼消,胜者之所得加败者之所失等于零”。所谓零和,是博弈论里的一个概念,意思是双方博弈,一方得益必然意味着另一方吃亏,一方得益多少,另一方就吃亏多少。之所以称为“零和”,是因为将胜负双方的“得”与“失”相加,总数为零。

2017-03-26 23:41:40 476

原创 HDU 1079 Calendar Game(NP状态交替)

It's a easy Game Theory......网上是这么说的,思想到时不难,但操作起来自己遇到些麻烦。作为一只博弈论入门级别弱脊,于是来写一篇题解总结一下吧,虽然是自己模拟出来的,但中间还是遇到了一丝丝麻烦。大家都知道,所有的后继状态是N状态的某个状态叫做P状态,后继状态中存在一个或多个状态为P状态的某个状态叫做P状态,哎,当时写的时候不知道咋想的,写×了,于是WA了好多次,但今天

2017-03-24 14:33:29 421

转载 HDU-1848--博弈SG函数模板题

这篇文章写的很好,值得转发。首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Grundy函数g如下:g(x)=mex{ g(y) | y是x的后继 },

2017-03-21 16:19:41 542

原创 HDU-5795 A Simple Nim(SG函数打表找规律)

题意:两人以最优策略对n堆物品进行操作,不能操作者输.1.从同一堆中取任意个(不为零).2.把一堆分成任意三堆(任一堆非空).思路:通过SG函数打表找规律,当对一堆物品进行分成三堆时,几种分法就是几种能到达的状态,而一种分法的SG值则是对该分法得到3份个数,对它们的SG值进行抑或起来就是该分法的SG值。最终可以找到规律,SG值当对8取余为7时,SG[x] = x

2017-03-21 15:36:33 384

转载 HDU-1005 Number Sequence(矩阵快速幂或模拟)

算是一道矩阵基础题吧,总之是对我很有启发性的一个矩阵题,之后类似的题估计都可以有这个思路,当然,这题也可以模拟出来。    Number Sequence HDU-1005 A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) +

2017-03-21 10:53:25 319

转载 关于C++set容器的使用

1.关于setC++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入

2017-03-11 10:35:52 489

原创 树状数组的基本操作

不得不说,树状数组很优雅,网上前几篇博文写的很容易理解,在这里主要是记录下自己的学习。先来张图,方便理解树状数组最主要的几个部分,一是求lowbit,一个正数的相反数的二进制是正数的二进制取反加1,因此它们之间进行&运算,便得到了lowbit——一个数二进制的只保留一个最低位的1,高位的1全部清空。int lowbit(int k){ return k&-k;}通过

2017-03-10 15:04:10 550

转载 关于C++ map容器的使用和pair类型及函数

首先make_pairPairs C++标准程序库中凡是“必须返回两个值”的函数, 也都会利用pair对象 classpair可以将两个值视为一个单元。容器类别map和multimap就是使用pairs来管理其健值/实值(key/value)的成对元素。 pair被定义为struct,因此可直接存取pair中的个别值.两个

2017-03-10 11:55:13 17447

原创 线段树

主要写写自己的想法吧,网上的前几篇博文写的都很详细,线段树主要目的主要是用来高效地解决单点或连续区间的查询或操作。线段树的叶子节点记录的是原数组的值,然后每个非叶节点都有一个左儿子和右儿子。比方说要求某区间内的最小值,已知叶子节点记录的是原数组值,那么它的父节点存储的值则是它和另一个同父兄弟节点两者间的最小值,即父节点表示的区间范围内的最小值,依照此种思路,不断向上更新,线段树的节点会存储相应

2017-03-09 17:09:08 351

原创 无权二分图的最大匹配(匈牙利算法)

二分图的最大匹配——匈牙利算法,先来了解一下二分图,顾名思义,二分图是可以将所有点分成两个部分的图,怎么判断呢,可以这么来,我们暂且将红色和蓝色看成两种相反的颜色,将图中的某一个顶点涂为红色,然后将和它相连的顶点涂成黑色的颜色,即与它本身相反的颜色,继续如此,如果按照这种方法可以将全部顶点都着色的话,那么该图就是一个二分图。二分图的最大匹配,其实就是不断寻找增广路,增广路本质是一条路径上的

2017-03-08 23:45:17 462

原创 图的割点和割边

在一个无向连通图中,如果删除后某个顶点之后,图不再连通(即任意两点之间不能相互可达),这样的顶点叫做割点。由此,删去某个顶点之后,然后进行一次dfs搜索一遍判断图是否还连通,便能求出该点是不是割点。但是时间复杂度颇高。所以,基于dfs搜索树设计了求割点的算法。求割点可分为两种情况,1. 求根节点的是否为割点,只要其有两棵或两棵以上子树,则为割点。2. 叶节点都不是割

2017-03-07 22:52:23 2818

原创 Prim算法最小生成树

学习本算法之前,先来回顾一下Dijistra算法的核心:用一个数组dis来记录源点到各个顶点的距离,然后每次扫描dis数组,从中选择出离源点最近的顶点,看通过该顶点为始点的边能否更新源点到其他各个顶点的距离。这里我们对这个方法稍稍改变一下,便能得到prim算法的核心。在这里用dis数组记录生成树中到各个顶点的最短距离,也就是说现在的最短距离不是到源点的最短距离,而是到已经被选入生成树中顶点的最

2017-03-07 16:00:15 303

原创 kruskal最小生成树

Kruskal算法的核心思想就是将边的权值从小到大进行枚举,枚举的过程中看该边的两点是否连通,假如不连通,那么这条边就可以加入到最小生成树中,假如连通,再将其加入最小生成树中,会产生回路。假如生成最小生成树到了上图这个时刻,此时有还有两条边的信息,45 权值为7, 43 权值为9,所以此时可看出4,5是连通的,应该忽略进行下一轮,此时43权值为9,可知3,4两点不连通,加入到最小生成树中。

2017-03-07 15:14:30 268

原创 并查集

并查集主要用来判断图是否连通,将所有连通的点选择一个点做老大,然后之后判断两点是否是同一个老大便可判断出是否连通。#include #include using namespace std;int f[105];int getF(int x){ if(x == f[x]) return x; else { f[x] = getF(f[x]); return f[x]; }

2017-03-07 12:15:12 234

原创 语言知识大杂烩

求π的值#include #include #include #include using namespace std;int main(){ const double pi = acos(-1.0); printf("%.100f\n", pi); return 0;}C语言中,浮点数类型默认为double型,float(-3.4*10^38~+3.

2017-03-07 12:00:09 345

原创 顺序栈的实现和c++模板

stack栈的基本操作:q.push(); 向栈压入一个元素q.top(); 返回栈顶元素q.pop(); 删除栈顶元素,无返回值q.size(); 返回栈中元素的个数q.empty(); 判断栈是否为空,真则返回true,假则返回false顺序栈判断回文#include #include #include using namespace std;i

2017-03-07 11:53:02 349

原创 堆的自行实现和c++优先队列模板

堆分为最小堆和最大堆,堆其实就是一棵特殊的完全二叉树,最小堆得特点是,所有的父节点都比子节点的数值要小,最大堆则就是所有的父节点都比子节点的数值都要大,所以取最小堆(最大堆)的最小值(最大值),都是取根节点的数值,插入数据呢,都是在完全二叉树最深层和最右侧的那个节点下一位置插入,当删除最值或插入新值的时候,都会破坏这种特殊的特性,所以我们要对此进行特殊的调整有两种调整,一种是向上调整,即从下面

2017-03-07 10:33:39 411

原创 Bellman-Ford算法(队列优化)

如果说Dijistra算法是通过点来对各个路径进行松弛的话,那么Bellman-ford是算法则是通过边来对进行松弛的。即枚举每一条边,然后比较源点到该边的终点的估计最短路径估计值和源点到该边的起点的最短路径估计值加上该边的长度,例如,已知源点到各个点的最短路径估计值dis[i]为 0 5 2 6 7,有一条边的信息为从点3到点4的长度为3,那么此时通过改变来进行松弛可以将dis[4] =

2017-03-06 23:19:01 998 2

原创 Dijkstra求最短路(邻接表存储,前向星存储,堆优化)

dijkstra算法主要用来求稀疏图的单源点最短路径,其核心是首先存储单源点到其它各点的路径,叫做估计最短径值,然后找出其中最短的一条路径,记录该点,那么此时该点的估计最短径值就变成了确定最短路径值。例如:这里同dis数组来记录单源点1到其它各点最短路径值,下标从1开始,最初其值为 0 5 1 3 4.此时得到dis[3] = 1为最小值,则可以确定源点到点3的最短路径,另外点3到点2有一...

2017-03-06 22:38:00 784

原创 Floyed-Warshall-求最短路

Floyed-Warshall算法是通过枚举每一个点,看能否通过此点来松弛边,即假设a点到b点最初为5,又已知a->c为2,c->b为1,那么此时就可以通过点c来松弛a->b的距离,松弛为3.采用邻接矩阵的形式存储边的信息,然后通过三个循环,第一层枚举所有点,第二层和第三层枚举边。于是得到:for(k = 1; k <= n; ++k) for(i = 1; i <= n; ++i

2017-03-06 22:35:16 601

原创 不常用的模拟链表

模拟链表的思想很简单,就是通过一个数组存储数据值,再开一个数组存储下标,来模拟链表中的next指针,从而实现插入,删除。通过right来记录,它的后继元素,当没有后继元素,它的right为-1。插入数据时,把数据存在data的len+1位置,然后再修改其right,下图是插入数据10的时候的变化。看代码吧~#include #include using

2017-03-06 22:09:46 275

原创 单链表的基本操作

详细请看代码#include #include #include using namespace std;typedef struct node{ int va; struct node *next;}Node, *LNode;int main(){ LNode p, q, l, L1, L2; int k, i, n, jk[100]; cin >> n; L

2017-03-06 18:11:21 382

原创 ctype.h头文件中的tolower和toupper以及cctype其他函数的应用

#include #include #include using namespace std;int main(){ char a = 't'; char b = 'T'; printf("%c---%c\n", toupper(a), tolower(b));}

2017-03-06 18:07:48 1374

原创 归并排序--二路归并

归并排序时的时间复杂度为O(nlgn)其主要思想是分治法(divide and conquer),分就是要将n个元素的序列划分为两个序列,再将两个序列划分为4个序列,直到每个序列只有一个元素,最后,再将两个有序序列归并成一个有序的序列再得到两个有序序列,再合成一个有序序列。。#include #include using namespace std;void mergeS

2017-03-06 18:01:26 635

原创 快速排序--自行实现+qsort+sort

快排呢,就是每次以第一个数为基准,把后面所有数归位,归位即将比它小的放在它的左边,比它大的放在它的右边。通过递归,再将它左边的数列进行如此排序,右边也如此,之后的之后的子数列也不断如此。#include #include using namespace std;void qsort(int jk[], int left, int right){ if(left >= rig

2017-03-06 17:35:45 404

原创 Today一只菜鸡的PAT甲级测试(PAT1124, PAT1125, PAT1126, PAT1127)

PAT (Advanced Level) Practise1124 Raffle for Weibo Followers (20)1125 Chain the Ropes (25)1126 Eulerian Path (25)1127 ZigZagging on a Tree (30)

2017-03-04 23:47:29 510

我的ACM个人模板模板

自己整理了很久的模板,继续加油~

2018-05-23

空空如也

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

TA关注的人

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