简单·Bamboo's Fight with DDLs III 分析 一句话:贪心,简单哈夫曼应用,要求的其实是所有结点的值与权值的乘积之和,也就是带权路径长. 可以理解为非叶子节点的权值的和,这里的权值就是零食个数 样例分析: 1 2 3 --- 1 2->3 3 3->6 3+6=9 所以得到6的同学是没有最后相加 因为只需要求最后的结果,不需要建树,可以用优先队列实现,每次挑权值最小的两个相加,将生成的新的结点进入到优先队列中,每次都要将pop的结点的权值加入ans中,直到队列为空 博客…
简单·Bamboo's Fight with DDLs I 分析 一句话:要装满的完全背包问题. 对比完全背包只有一点要改变:初始化为负无穷 传送门: https://buaacoding.cn/problem/101/index 装满的01背包,有何不同大家自己思考 代码样例 #include<iostream> #include<cstdio> #include<cstring> #include<string> using namespace std;…
中等·Bamboo's Fight with DDLs II 分析 一句话:给定字符串,求最长回文子序列长度,动态规划LCS思想的进阶应用 具体思路如下: 对于任意字符串,如果头尾字符相同,那么字符串的最长回文子序列等于去掉首尾的字符串的最长子序列加上首尾:如果首尾字符不同,则最长回文子序列等于去掉头的字符串的最长回文子序列和去掉尾的字符串的最长回文子序列的较大者. 因此动态规划的状态转移方程为: 设字符串为str,长度为n,dp[i][j]表示第i到第j个字符间的回文子序列的最大长度(i<=j…
1119 AlvinZH's Fight with DDLs III 思路 难题,最小点覆盖. 分析题意,某一个任务,既可以在笔记本A的 \(a\) 模式下完成,也可以在笔记本B的 \(b\) 模式下完成.如果笔记本A处于x模式,那么所有可以在笔记本x模式的任务可以一起完成,B同理.这两句话作为题目核心,该如何转化呢? 对于每个任务对应的(a,b),我们把它映射到平面坐标当中,明显发现,此题和二营长,你他娘的意大利炮呢简直一模一样.其实就是一个最小点覆盖问题,也就是最大二分图匹配问题. 关于最小…
1117 AlvinZH's Fight with DDLs I 思路 简单题,动态规划. 本题与期末练习赛B题很相似,而且更为简单些.简化问题:在数字序列上取数,不能取相邻的数. DP数组定义,dp[i]:到达第i层所能取得的最大经验值.初始化:dp[0] = x[0], dp[1] = max(x[0], x[1]). 对于第 \(i\) 层,有两种选择:不打,等于 \(dp[i-1]\):打,等于 \(dp[i-2] + x[i]\).二者取最大值即可. 状态转移方程:\(dp[i] =…
1124 ModricWang's Fight with DDLs I 思路 这道题本质上就是一个多项式求值,题目中的n需要手动算一下,单位复根可以根据复数的性质来求,即\(e^{i\pi}+1=0\),对指数\(i\pi\)进行乘除就能得到各个单位复根,带进多项式即可得到答案.需要注意的是,这里的函数次数k很小,因此时间复杂度为\(O(k^2)\) 的朴素算法是完全没有问题的.如果k大一些,就可以使用FFT了,这个题的题面在做的其实就是求一次FFT.希望通过这一个题帮助大家巩固一下FFT的定义…
1126 ModricWang's Fight with DDLs III 思路 由于题目中已经说明了时间经过了正无穷,因此初始位置是不重要的,并且每条边.每个点的地位是均等的.因此到达每个点的概率就是这个点的度数+1(可以停留就等于是有一条连向自己的边),最后的概率就是 \[\frac{\sum S中的点的度数}{\sum 所有点的度数}\] 时间复杂度\(O(m)\),空间复杂度\(O(m)\) 代码 #include <iostream> #include <set> #in…
1118 AlvinZH's Fight with DDLs II 思路 中等题,贪心. 理解题意,每次攻击中,可以使某个敌人生命值-1,自己生命值减去∑存活敌人总攻击力. 贪心思想,血量少攻击高的要先消灭,所以以A/L作为参数排序,即将所有的敌人根据A/L从大到小排序. 遍历一次,对于排序好的敌人,HP减去(总攻击*该敌人血量),总攻击减去该敌人攻击.代码如下: HP -= (sumA * H[i].L); sumA -= H[i].A; if(HP <= 0) break; 分析 贪心证明:…
1125 ModricWang's Fight with DDLs II 思路 圆内被划分部分数的计算方式如下: 圆内部的每一个交点都使得总份数增加了一:除此之外,每一根直线段最后抵达圆周时,总份数也增加了一. 因此: 总份数应该是 \(1+圆内部的交点数量+直线段的数量\) 直线段的数量等于 \(C_n^2\) 交点数量的求法需要一些思维量.可以把圆内部的每个交点看成是某个圆内接四边形的对角线交点,于是在n个点中,任意四个点的组合都对应了圆内部的某个交点.因此,交点数量等于 \(C_n^4\)…
简单记录下题目类型和做题情况,理性复习同时也希望提供一些参考 题目描述 共计八个题目,按照助教的划分,题目分类如下 一个签到(二分查找),两个板子(活动选择.KMP(洛谷kmp模板题)),一个板子变形(KMP多次匹配) 四道中等:一个动态规划题目(稍微有些改变的原题,难受),一道结合了计网OSPF的网络流题目(应该是),一道圆的计算几何题目(两点在一圆外,计算两点的最近距离),最后一道忘了. 做题情况 做题情况就是,总人数二百多,做出四道题目的有一百多,后四道有十多位大佬做出了部分 我自己就是第…
1086 AlvinZH的青春记忆IV 思路 难题,动态规划. 这是一道很有意思的题,因为它不仅卡了时间,也卡了空间,而且卡的很妙很迷. 光是理解题意已经有点难度,简化题意:两串数字序列,相等的数字定义为可以交战,若 Ai==Bj,则 Ai 可与 Bj 交战,之后下一场 Aii.Bjj 交战的条件是:Aii==Bjj.ii>i.jj>j.Aii>Ai.Bjj>Bj . 这是什么呢?最长公共子序列?最长递增子序列?都很像,其实是最长公共递增子序列!最长公共子序列与最长递增子序列的叠加…
1083 AlvinZH的青春记忆III 思路 难题,二分图. 说这是一个考察二分图的题目,你可以会说"不可能",这哪里像一个二分图了!这真的是一个二分图,考察的是最小顶点覆盖. 你不知道最小顶点覆盖没有关系,别百度,先慢慢分析,别先入为主. 简化题意.A.B两列数字,若B[i]%A[j]==0,则二者需要去掉一个.问一共最少需要去掉多少人! 错误方法:二重循环记录可以整除的双方编号B[i]和A[j],记M1[A[j]]=M2[B[i]]=true,之后求M1.M2中为true的数量,…
1111 AlvinZH的序列问题 思路 中等题,动态规划. 简化题意,. 坑点一:二维int数组MLE,明显会超过内存限制,由于\(n\)最大为1e4,那么我们的dp数组最大也是1e4,考虑使用short int. 坑点而:被题目开始的子序列描述误导,题目没有要求等差数列中数字顺序和输入顺序一致,所以可以先将数组排序. dp[i][j]:以A[i].A[j]开头的等差数列(可保证i<j).初始化值为2. 状态转移:固定j,i与k分别向两边扩展,当2*A[j]=A[i]+A[k]时,说明A[i]…
1083 AlvinZH的青春记忆I 思路 中等题,动态规划. 简化题意,一个环上取数,数不可相邻,取取得数之和最大值. 环不好表示,可以解开变成一列数,那么答案应为下列两种情况较大者. ①:取第一个点,可取得最大价值为宝物[1,n-1]的最大价值. ②:不取第一个点,可取得最大价值为宝物[2,n]的最大价值. 动态规划,状态转移方程:\(dp[i] = max(dp[i-1], dp[i - 2] + V[i])\) 分析 时间复杂度:\(O(n)\). 参考代码 // // Created…
1084 AlvinZH的青春记忆II 思路 中等题,二分. 简化题意,一列数字,每秒会自动-1,特殊操作可以使一个数在1s内-k,问这些数都减至0需要多久. 答案肯定在[1,xMax]之间,采用二分的方法找到最小时间. 如何判断一个时间值是否符合要求呢?对于≤mid的数,自然消减就好,对于>mid的数,需要特殊操作,设特殊操作次数为s,则有 \(k*s + (mid-s) = Xi\),解得 \(s = (X[i]-mid) / (k-1)\). 分析 注意三个问题, 第一,除0问题,k-1可…
1063 wuli51和京导的毕业旅行 思路 中等题,二分+贪心. 简化题意,将m+1个数字分成n份,ans为这n段中每段数字和的最大值,求ans最小值及其方案. 对于这种求最小的最大值,最常用的方法是二分.答案一定在[0,sum]之间,通过判断是否符合要求可以求得ans.在本题中,ans一定是整数,所以二分过程中left.mid.right也是整数. 如何判断是否符合要求?对于某一mid值,遍历一次露营地距离数组,通过贪心,总是使一天内的行程尽可能接近mid,但不可超过mid.若是加上某一露营…
870 斐波那契进阶 题目链接:https://buaacoding.cn/problem/870/index 思路 通过读题就可以发现这不是一般的求斐波那契数列,所以用数组存下所有的答案是不现实的.题目也明确点明此题可以利用矩阵的计算解题. 如果你稍微百度一下你会了解到快速矩阵幂的概念. 什么是快速矩阵幂? 分析 快速矩阵幂算法是一种简单的具有典型意义的连续为离散算法,同学们一定要掌握其思想,而不是从网上copy一份板子就用. 时间复杂度:\(O(lgN)\): 考点:简单的快速矩阵幂: 坑点…
Bamboo&APTX4844魔发药水 题意 "于是,Bamboo耐着性子,看巫师从袖子里掏出 M 瓶时光泉水和 K 粒绿色能量.每瓶时光泉水重量为 c ,生发效果为 l:每粒绿色能量的重量为w ,生发效果为 r.但一瓶APTX4844的重量不能超过 S,否则很难过安检(难道不是难以下咽?)." "配置魔发药水需要用到至多两种原料:固态的绿色能量和液态的时光泉水.但是由于两者副作用不一样,*制作时优先选用副作用小的绿色能量,即先考虑使用绿色能量使得生发效果最大,然后再…
Bamboo and the Ancient Spell 分析 可能英文读题难度比较大,但是只要看到全大写的 "THE LONGEST COMMON SUBSEQUENCE !"应该就清楚这是考什么的了. 最长公共子序列:可以不连续.序列长度很大时,暴力方法非常费时,这也是一道比较经典的<算法导论>上的动态规划题. 设序列X=<x1, x2, -, xm>和Y=<y1, y2, -, yn>的一个最长公共子序列Z=<z1, z2, -, zk&…
Bamboo之吃我一拳 分析 当两个点的距离<=d时,才可以出拳,想要使得满足出拳条件的点对最少但不为0 寻找最近点对距离,得到的最近距离能够使得可以出拳的组数最少,因为除了最近点对外其他组合均不符合条件. 在一堆点中找到两个点的距离最小,暴力的O(n^2)计算量很恐怖,可以用分治思想把问题变小: 把平面上的点分为两拨,距离最近的两个点只可能出现在:第一堆,第二堆,和两堆2中各自一个点 分解 想象一条垂直线把所给点集分成两拨:所有的点要么在直线左边,要么在其右边.按x坐标升序排列. 解决 划分后…
Bamboo之寻找小金刚 分析 可以抽象为许多连续线段,分别计数左拐和右拐的个数.考察叉积的基础应用. 假设ABC三点构成一个夹角∠ABC,B就是拐点,AC是辅助形成夹角.考虑线段AB和BC形成的向量 sin∠ABC= (AB * BC)/|AB|*|BC| 两个向量的叉乘除以它们的模 所以叉乘可以判断夹角是否大于180°从而确定转向.当然叉积是有方向的,可以自己选择哪条边在前,只要标准统一即可.每三个点组成一组,遍历,分别计数左拐数和右拐数.具体叉积相关操作可以看<算法导论> 注意 常见的一…
1064 Bamboo和"Coco" 分析题意 每个亡灵至少一个花瓣,相邻的亡灵中思念值高的要获得的花瓣高(思念值相等是不需要花瓣一样多的).主要考贪心思路,为了使得花瓣总量最少,每次比思念值更低的"邻近亡灵"的花瓣数多一就可以了 思路 都是先保证每个亡灵至少一个花瓣 思路一 直接模拟思路,同时关心左边和右边(或者说前边和后边),一次循环是不够的,比如3 2 1,修改了1号的花瓣数,再修改2号的花瓣数,此时会对一号产生影响.需要多次遍历,直到没有新的改变为止,算法为…
Bamboo和人工ZZ 题意: 非常直白,经典的动态规划矩阵链乘问题 分析: 矩阵链A1A2..An满足结合律,可以使用加括号的方式,降低运算代价. 一个pq的矩阵和一个qr的矩阵相乘,计算代价为pqr 加括号时满足动态规划的特性 长度为1的矩阵不需要加括号 长度>=2的矩阵链AiAi+1.....Aj,势必在 Ak和Ak+1之间加括号,分成的两组中各自的加括号方案已经是最优的了. 以m[i][j]表示Ai-Aj矩阵链乘的代价,则 核心语句: i=j m[i][j]=0; i<j m[i][j…
B Bamboo和巧克力工厂 分析 三条流水线的问题,依然是动态规划,但是涉及的切换种类比较多.比较易于拓展到n条流水线的方式是三层循环,外层是第k个机器手,里面两层代表可切换的流水线 核心dp语句:cost[i][k] = min(cost[i][k], cost[j][k-1]+t[j][i]+p[i][k]) 也可以在A题的基础上详细的列出所有可能的路线切割情况然后找到最小值. 注意本题与A题中t的含义不同. 上机时给出的伪代码 //数组从0开始 const int maxx= 510;…
A Bamboo的小吃街 分析 经典的两条流水线问题,题目描述基本类似于课件中的流水线调度,符合动态规划最优子结构性质 关键的动态规划式子为: dp[0][j] = min(dp[0][j - 1], dp[1][j - 1] + t[1][j - 1]) + p[0][j] //保存在左边第j个店铺时已经用的时间 dp[1][j] = min(dp[1][j - 1], dp[0][j - 1] + t[0][j - 1]) + p[1][j] //保存在右边第j个店铺时已经用的时间 即到达i…
Bamboo的饼干 分析 从两个数组中各取一个数,使两者相加等于给定值.要注意去重和排序 难度不大,方法很多,基本只要不大于O(n^2 ) 的都可以过.本意想考察二分搜索 还可以借助stl中的map,set以及lower_bound等,当然只用数组也可以做.由于数据范围不大,也可以直接用数组下标来计数. 提起去重,有同学似乎一直纠结 (2,3)和(3,2)算不算重复数对..不算!只有(2,1)(2,1)这样的是真·重复对 map 这是很多AC代码用到的方法.因为map的key值是不重复且有序的,…
Bamboo的OS实验 分析 首先理解题意,要完成不同数量的不同命令,但是完成相同的命令之间必须有n个间隔,为使得时间最短,自然优先用其他命令来填充这n分钟的时间,由于数量少的命令可以用来填充空隙,所以次数最多的命令是起作用最大的.而且注意到,每次具体执行的是哪个命令并不影响时间,只与命令的数量有关(这有点贪心的思想,当预习吧) 基于以上分析,可以有以下几种方法: 1.按照命令数量从大到小排列,每次都是从数量最多的命令开始新一轮周期,这样是用时最少的. 举个栗子,命令1 2 3 4 5各有6 1…
1082 AlvinZH的学霸养成记VI 思路 难题,凸包. 分析问题,平面上给出两类点,问能否用一条直线将二者分离. 首先应该联想到这是一个凸包问题,分别计算两类点的凸包,如果存在符合题意的直线,那么这两个凸包(凸多边形)一定是不相交的. 计算凸包一般有两种方法,Graham扫描法和Jarvis步进法. Graham扫描法比较简单,好理解,书中也有伪代码.先找到最左下点P0,对剩下的点相对P0进行极角排序.然后依次进栈判断.当算法终止时,栈中从底部到顶部,依次是按逆时针方向排列的凸包中的点(有…
978 AlvinZH的1021实验plus 思路 贪心,中等题. 使用miss变量表示未覆盖的最小数字,初始值为1. 初始覆盖区间为[1,miss),目标是覆盖[1,m],即miss需要大于m. 需要比较miss和数组里没有使用的数字中最小的数字x(所以需要先给数组排序. miss更小:没有一个组合可以满足需要的值,需要插入该值,即插入miss,这时覆盖区间变成 \([1,miss<<1)\) . miss更大:当前可以覆盖[1,miss),加上此值,覆盖区间变为 \([1,miss+x)\…
904 Winter is coming 思路 难题.首先简化问题, \(n\) 个0与 \(m\) 个1排成一列,连续的0不能超过x个,连续的1不能超过y个,求排列方法数. 显然会想到这是动态规划.最快想到的方法是 \(dp[i][j][x][y]\) 表示已经有i个北境兵j个野人参与排列,且末尾有x个连续北境士兵或y个连续野人士兵的方案数.这方法显然是正确的,但是光是 \(dp[200][200][10][10]\) 数组已经十分接近本题内存限制了,保证MLE.状态转移方法是大模拟,四层fo…