摘要:分类: 贪心, 树结构题意: n个结点,以最小生成树方式连接,有一个结点是服务器,可以服务k以内的叶子结点,求还需要放几个服务器,覆盖所有叶子结点输入: 数据组数T,结点数n,距离k, n-1行表示连接关系输出: 还需要放置的最小服务器数解法: 第一步, 构建有根树,获得结点的深度值和叶子结点 从最底层的叶子结点,自底向上贪心解决覆盖问题 注意,没加入一个服务器,dfs距离k以内的所有结点探测是否要覆盖叶子结点,但不是只遍历一次,注意算法的思路 注意是否需要考虑边界条件和特殊情况#include #include #include #include #include #i...
阅读全文
摘要:分类: 贪心题意: 有一个n*n的格子,里面可能又字母,可能是'.'代表没字母,求出一种字母填法,使得从上到下,从左到右字典序最小输入: 组数T,初始方阵输出: 填好的方阵解法: 关键在于理解题意 只要满足从上到下从左到右字典序最小,那么就按照从上到下从左到右的顺序贪心填写 每一次与四个方向比较#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include
阅读全文
摘要:分类: 高效搜索题意: 有N个pie,分成F + 1份,面积相同,且每个pie必须是完整的,求最大的每个分块的面积,精确到误差小于0.001输入: T组数据,每组数据的N,F,以及每个pie的半径,都是整数输出: 最大的分块面积,误差小于0.001解法: 注意: ①PI的精确程度会影响答案 ②floor函数的使用 搜索, 按照满足条件的分块搜索答案, 提高效率, 二分查找 关键在于,本题的二分如何写,解空间是多少double findAns(double ll, double rr){ double leftVal = ll; double rightVal = ...
阅读全文
摘要:分类: 高效搜索,二分题意: 给定电脑各种配件,每个配件有价格和品质因子,在给定钱数b的前提下,每种配置选一个,使得最小品质因数最大,保证有解输入: 测试组数T, 钱数b,配件个数n,以下n行为每个配件的分类, 名称, 价格, 品质因子输出: 最大的品质因数方案的品质因子核心: 搜索答案,按照品质因子个数进行二分查找 二分查找是个蛮有趣的问题,恰好这个题里面一些细节处理不好是通不过测试的。 ① 基本二分: int right = upper; while(left = num) right = mid; else left = mid +...
阅读全文
摘要:分类: 递归与模拟题意: 汉诺塔问题改版,求对于给定状态的汉诺塔问题,到指定目标状态,需要多少次操作输入: 盘子数目n,每个盘子所在的架子编号输出: 移动次数解法: 经典汉诺塔问题,f(n) = 2 * f(n - 1) + 1;其中f(1) = 1,将1-n的盘子移动到另外一个盘子需要的次数 这个题怎么做,想了好一会没有特别好的思路,参考了书上的解法 初始状态 ----> 中间状态(必须经由) ----> 目标状态 由于可逆性,可以改为初始状态 ----> 中间状态 #include #include #include #include #include #incl...
阅读全文
摘要:分类: 中位数与递归题意: 给定n表示整数序列1...n,每次操作可以同时选择一个或者多个整数,同时减去一个整数,求次数最少输入: 整数n输出: 最小次数解法: 化为n/2的子问题,f(n) = f(n / 2) + 1, 起始点f(1) = 1, 解之f(n) = log(n) + 1 关键问题是,为什么这样次数就是最优的? 书上和许多其它报告多提的是多次尝试,权且如此吧 #include #include #include #include #include #include #include #include #include #include #include ...
阅读全文
摘要:分类: 枚举 和 剪枝题意: 给定矩阵由0,1组成,使用最少的改变(使0变成1),使得任何元素的上下左右元素(如果存在)和为偶数输入: 测试组数, 矩阵大小n ,矩阵每一个数输出: 最小翻转次数,无法实现则输出-1解法: 类似关灯问题,枚举第一行的状态(2^n)种情况,依题意,所有的后续方格可以由上面确定,检查翻转次数与是否满足 关键在于如何编写,即按照顺序确定每一个方格的状态 在代码中体现为 check函数,注意实现过程中适当剪枝,提高速度#include #include #include #include #include #include #include #incl...
阅读全文
摘要:分类:排序与坐标映射题意:给定木棒上蚂蚁的位置,木棒的长度,运动方向和速度,以及时间,确定之后蚂蚁的状态。蚂蚁碰撞同时改变方向,速度不变输入:组数, 木棒长度, 时间T, 蚂蚁个数n, 以下n行是蚂蚁的位置(距离左端),以及运动方向输出:按照输入顺序,每只蚂蚁的状态,掉下则为“Fell off”,正在碰撞为“Turning”, 其余为位置和方向解法: 核心:关注最终结果,“对穿”,见《训练指南》 关键:如何“按照输入顺序”输出“最终结果” 对每只蚂蚁记录其inputOrder为输入顺序,再按照初始位置排序,注意这个排序的下标即为最终终态的蚂蚁下标,记录为finalPo...
阅读全文
摘要:分类: 中位数与排序统计学题意: N个人每个人有Ai个金币,综合整除N,每个人可以给相邻的人一定数量的金币(圆环) 如何给使得金币流动数最少,而且每个人最后金币数量一样输入: N,每个人金币Ai输出: 最小的金币流通数目解法: 设Xi为第i个人给第i-1个人的金币数,x1表示第一个人给第四个人,只设置单方向(双向可以抵消) 列方程组 A1 - X1 + X2 = M . . Ai-1 - Xi-1 + Xi+1 = M 有n-1个方程组, Ai和M是常数 优化目的 sigma(|xi|)最小,简...
阅读全文
摘要:天又翻开CLRS,看了看前几章的习题,做了一些回顾,做一些笔记吧。1.递归式求解常用的主方法以b为base,取a的log,与变量f(n)进行比较,然后三种情况。2. p23 2.3-6 在插入排序中加入二分检索在Insertion-sort中前5-7行向A[1...j -1]寻找一个恰当的位置来放置A[j],在这个过程的同时,把每一个比A[j]大的元素向后移了一位,二分检索可以减少寻找位置的时间,但是不能减少移动元素所需要的时间,因此单独加入二分检索不能减少Insertion-sort所需要的时间。3. p23 2.3-7 设计一个算法,在O(nlgn)以内判断给定集合S中有没有两个数的和为给
阅读全文
摘要:分类: 贪心题意: 每个人分派任务,分配和完工需要时间,如何安排分配顺序总完工时间最小输入: 任务数N,每个人分配需要的时间B,每个人执行需要的时间J输出: 总完成最快时间、解法:贪心核心:①两个任务交换顺序不会影响其它任务的最终完成时间②那么何种情况下交换两种任务可以减少总时间分两种情况情况一:交换之前前面的任务后结束J[1] >= J[2] + B[2] [B...1][J...........1] [B.2][J.2] B[1]+J[1]是总时间且 > B[2]+B[1]+J[2] 如果交换 交换后完成总时间是 B[2]+B[1]...
阅读全文
摘要:题意:有n条恶龙,m个骑士,每个骑士能够斩掉直径为x的恶龙需要支付他x的费用,如何聘请骑士费用最小输入:整数n,m 每个龙的直径,每个骑士的能力(费用)输出:最小费用,无解则输出Loowater is doomed解法:贪心#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using na
阅读全文
摘要:分类: 堆题意: 切割平板为指定的分块大小,每一次切割的费用都是当前木块的长度输入: 切割成的块数N,每块大小xi输出: 最小的切割费用自己练习写一写堆,也可用STL的优先队列 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 ...
阅读全文
摘要:分类: 线段树题意: 求矩阵面积并输入: 矩阵个数N,每个矩阵的左下角坐标和右上角坐标输出: 矩阵的面积并很久没有做数据结构了,这道题算是比较经典,难度相对适中的吧,今天拿出来写了一遍。数据结构主要是线段树。虽然写过几次了,每次动手写都会遇到一些问题。做个笔记:1.基本算法:将矩形沿着Y方向的平行于X轴的线作为扫描线。核心算法在于对于n – 1条扫描线作的高度差用来算矩阵的面积上面两张是比较好理解的图(来自网络)。线段树的作用就在于保存当前的X轴覆盖区域的长度为多少,每一次,顺着扫描方向,插入一段扫描线更新当前的覆盖区域长度(会有重合)。一个技巧:把下边的边flag设置为true,上面的边设置
阅读全文