自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

菇凉加油

我不牛,可是我很认真。

  • 博客(23)
  • 收藏
  • 关注

原创 回溯法求数字1,2,……n 的所有子集

求数字1,2,n 的所有子集,用一个数组position来保存每次要回溯时的位置,而且每次前进时的位置起点为上一次位置的后一个位置开始。

2016-03-11 16:28:11 1211

原创 596 C. Wilbur and Points

将具有相同 wi 的点放到同一个 set 中去,这里用 map  来实现,而且插入到  set 中的点是按 x 坐标的升序排序,因为最后的结果肯定是要 x 和 y 都尽量小的在前面。用两个 vector, 一个存储 由点坐标求出来的 w,一个存储输入的 w,排序后比较这两个vector,如果不相同,则结果为 “NO”, 否则就按输入的 w 的值,来在相应的 set 中找点,按顺序分配完所有

2015-11-23 15:15:02 380

原创 codeforce 582 A. GCD Table

显然矩阵中最大的那个数就是要求的数组中最大的那个数,所以首先把这个最大的数放到数组里去。这里用 set 来存放矩阵中的数,因为 set 有插入数据时自动排序的功能,而且我们每次要取的数都是 set 中最大的数,所以用这种数据结构很方便。取完第一个数后,要把这个数从 set 中删除,接下来的就是一个循环取最大数的过程了。循环过程:每取完一个最大数,先把这个数从set  中删除,然

2015-11-20 21:23:24 335 2

原创 codeforce 577 B. Modulo Sum

当 n 大于 m 时,n 个数的和的种类至少有 n 种,根据鸽巢原理,n 种和 放到 m 个盒子里,必然有至少两个相同的和放到同一个盒子中。设得到这两种和的序列 为 a1,a2,……,al, 和 b1,b2,……,br,那么 bl+1,……,br 这段序列的总和必然为0 ,则结果必然存在d当 n 小于等于 m 时, 用动态规划,相当于0/1 背包问题,对于每一个 a[i] 有要或者不要两种选择

2015-11-19 18:09:04 354

原创 codeforce 589 D. Boulevard

暴力搜索,对于第 i 个人,判断所有第 j ( j=i+1,……,n) 个人是否能与其相遇,如果能相遇,则第 i 和第 j 个人的相遇人数都要加 1 .首先要对 第 i 和第 j 个人的起始位置进行判断,如果谁进入道路的时间早,就走到 晚进入道路的那个人 进入道路的时间点;此时再对这两个人剩余的路途进行判断,如果两个人中谁的剩余的路途为负数了,说明在另一个人还没上路之前这个人就已经到达终点

2015-11-18 17:01:18 418

原创 590 A. Median Smoothing

找 0 和 1 相间的字串,只有 0 和 1 相间的地方才需要修改,修改的次数就是修改最长0/1相间字串的次数,由于每次修改都是对称的,所以总的修改次数为最长字串长度的一半。每次修改字串有两种情况,当字串首尾元素相同时,整个字串都修改为 首尾元素;当首尾元素不相同时,前一半修改为首元素,后一般修改为尾元素。代码如下:#include using namespace std;

2015-11-14 15:48:13 353

原创 cordeforce 591 B. Rebranding

首先对输入的两个字符比较,相等就不用处理,如果不相等就进行两次映射这里有两张映射表,map1 用来存储某个字符映射到哪个字符了,比如 map1[ a ] = h ,说明字符 a 被替换成字符 h 了;map2 用来存储某个字符是由哪个字符映射而来,比如 map2[ a ] = h,说明字符 a 是由字符 h 映射而来。简单说这两张映射表一个存储去向,一个存储来源

2015-11-14 10:31:43 370

原创 codeforce 11B. Jumping Jack

由于输入的 x 有可能是负数,如果是负数,相当于向走走,取其绝对值后相当于向右走,因为向右和向左走的距离一样。预处理x=(x>0?x:-x)每走一步,跳的距离就增大一个单位,那么每次跳的距离是个等差数列,求这个数列的前 n 项和的公式为 (1+n)*n/2所以首先找到前 n 项和大于或等于 x 的 n 的值,相当于对公式 (1+n)*n/2 = x 求出 n ,由于x 已知

2015-11-12 19:16:55 519

原创 prim算法求最小支撑树 打印支撑树边的集合 带图例说明

prim算法的思想是,给定一个集合 setX,初始为{ 1 },也就是只包含第一个顶点,和另一个集合 setY, 初始为 V - { 1 },找出一条权重最小的边(x,y),x 属于 setX, y 属于 setY,然后将这条边加入到最小支撑树中,同时 setX + { y }, setY - { y }。V 表示所有顶点集合。代码#include #include #in

2015-11-11 17:07:21 570

原创 cruskal算法求最小支撑树 打印支撑树的边集合 带图例

cruskal算法的思想很简单,就是把所有边按权值大小排序,由小到大,然后依次选一条边,如果这条边加入最小支撑树中不会造成回路,就把这条边加进去,否则取下一条边继续探测。如果这个图有 n 个顶点,则选出 n-1 条边即可。思想很简单,可实现却涉及到一种特殊的数据结构,叫不相交集。这种集合有两个主要的操作,一个是合并,就是将两个元素合并到这个集合中,合并时按秩合并的,秩大的作为秩小的

2015-11-11 16:20:05 905

原创 三着色问题 递归和迭代方法 打印着色方案

给一个图,这里用的是无向图,用三种不同的颜色给这个图中的所有点着色,要求有边关系的点不能着同样的颜色。跟8皇后问题很相似,每个点的候选颜色只有三种,对每个点进行颜色选择时,要判断是否与自己有边相连的点颜色冲突,如果冲突,则在候选颜色里选下一种,如果候选颜色选完了还没选到合法的颜色,则需要回溯,将上一点的颜色加1.代码#include #include #include #

2015-11-11 15:59:06 1013

原创 8皇后问题递归和迭代方法 打印皇后位置

8*8的棋盘,8个皇后放入其中,要求所有任何皇后不能在同一行同一列,也不能都在对角线线上对每一个皇后的候选位置进行探测,(每个皇后的候选位置都是从第一个到最后一个),如果当前位置不和之前的皇后冲突,则选下一个皇后的,否则就要向前回溯,把上一个选好位置皇后的位置往后移一个代码如下#include #include #include using namespace std;

2015-11-11 15:50:55 394

原创 旅行商问题 打印路径

从一个起始点(默认第一个点)出发,找到一条花费最短的路径经过所有其他点,然后又回到出发点,除了起始点经过两次,其他所有点必须经过一次且只能经过一次。这里用到了set, set是一个不包含重复元素的集合,表示还未访问到的点,函数fun( i, set ) 表示从点 i 经过set 中的所有元素的最短路径。这个问题可以这样分解,枚举 set 中的每个元素,选出点 i 到这个元素的距离

2015-11-11 15:20:07 737

原创 金钱兑换问题 动态规划 打印兑换后的硬币

有一个货币系统,有n 种硬币,每种硬币的面值为 v1,v2,……,vn, 且 v1 必定为 1 , 目的是兑换价值为 sum 的钱,让硬币数量最少。result[ j ] 表示价值总钱为 j 的最少硬币数,print[ j ] 表示价值钱数为 j 时用的是哪个硬币来换的。当只有 1 种 硬币时, 即只有面值为 1 的硬币,那有多少钱,兑换后的数量肯定就是多少。所以 result

2015-11-11 14:51:03 2677

原创 完全背包问题 打印背包中的物品

与0/1背包问题不同的是,每个物品可以任意次放,只要小于总容量就行,这里打印装进去的物品,还打印每种物品装了多少次代码如下:#include #include #include using namespace std;int main(int argc, char** argv) { cout<<"完全背包问题"<<endl<<endl<<"输入背包总容量"<<endl;

2015-11-11 14:39:56 1365 1

原创 0/1背包问题动态规划 空间复杂度是o(C)

有num个物品,总背包容量为Capacity, 求不超过背包总容量的前提下使得背包里的物品的价值达到最大的物品是哪些物品。对于每个物品,只有两种选择,要么装要么不装进背包。那么在考虑前 i 个物品时,在当前容量为 j 的条件下,如果这个物品的体积小于当前背包剩下体积,且装入此物品的价值比不装此物品的价值大,就装入此物品 ,设第 i 个物品的体积为 vol[ i ] ,价值 为 va

2015-11-11 14:32:03 5662

原创 最长公共字序列 动态规划 空间复杂度o(min{n,m})带打印

这是典型的动态规划,两个字符串 str1=a1,a2……,an, str2=b1,b2,……,bm;如果用dp[i][j]表示str1的前 i 个字符 和str2的前 j 个字符的最大公共子序列的长度,那么dp[n][m]就是要求的结果,但这种方法的空间复杂度是o(nm),但其实每次要用到的只是上一行的结果,所以空间复杂度可以优化为o(min{n,m}).这里设 vecOrignal

2015-11-11 13:43:06 941

原创 斐波那契数的迭代实现和递归实现

斐波那契数就是后一个数等于前两个数之和,举例 1,1,2,3,5,8,13,21,34,……一般来说,递归的算法思想简单,代码简洁,但是如果递归层数过深,容易栈溢出,因为没递归一次就要保存一次现场啊,然后回来一次还要恢复现场,迭代则是代码长点,但不用函数调用的开销。这里两种方法都给出。#include using namespace std;int fabonacciDIGUI(

2015-11-11 13:11:41 352

原创 无权图(有向或者无向)的 创建 插入边 删除边

用链表结构存储无权图,#include using namespace std;class Node{ public: Node()=default; Node(char val):value(val),next(nullptr){} inline Node*& getNext(){ return next; } inline char getValue(){

2015-11-11 12:52:17 3556

原创 双链表的各种操作 创建 插入 删除 查找

双链表的各种操作,考虑全面,所有操作的起始位置为1

2015-11-11 12:29:04 399 1

原创 cordeforce 7A. Kalevitch and Chess超简单代码

每次看别人超长又复杂的代码就忍不住写个简单点的代码。题目大意,把一个8*8的全白棋盘涂成顾客想要的棋盘,最少需要多少步,顾客要的棋盘有一个特点就是某些整行或者某些整列是黑色的。count[ j ] 记录第 j 列上有多少个 'B', 先按行处理,每行跟一个模板string "BBBBBBBB" 比较,如果某行等于这个模板,说明这行需要被涂黑,涂完后每列上的 'B' 就少

2015-11-10 20:11:17 432

原创 codeforce 4D Mysterious Present 简单思路 动态规划

看网上的代码和思路,感觉好复杂的,决定自己写一个代码简洁,思路简单的代码。这题的意思就是要找出一个最大子序列,这个最大子序列的每个元素就是一个信封,每个信封包含两部分,即信封的宽度和长度,要求序列中的元素的两个部分都是单调递增的,即单独按宽度看,所有信封的宽度是单调递增的,单独按长度看,每个信封的长度也是单调递增的,这样才能保证小信封可以放进大信封里。首先, 筛选输入的元素,只有宽度和长度

2015-11-09 19:51:09 825

原创 CF 3C Tic-tac-toe 井字棋 简洁代码

题目大意就是给你一个 3*3 棋盘,要你判断 A,B 哪个选手赢了,或者该谁下了,或者平局,或者棋盘不符合规则。这里分六类  (假设A先走)1. 输出 the first player won 的条件是,A符合赢的条件(某行或某列或对角线的字符一样),且B不符合赢的条件,且A的步数比B多1,因为A先走的。2. 输出 thesecond player won 的条件是,B符合

2015-11-07 19:35:40 715

空空如也

空空如也

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

TA关注的人

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