864 AlvinZH的儿时回忆----跳房子 题目链接:https://buaacoding.cn/problem/864/index 思路 这是一道简单题,但是同样有人想复杂了,DP?大模拟?. 本题只要判断能不能到达最后一个格子,又没有问方法数.所以,只需要一个单变量rightMost记录最远能到达的地方,遍历一次数组后比较其与n的大小即可. 分析 经典染色问题的转化:可以把跳格子的过程看成是染色,设在某一时刻,index=m的位置已经被染色了,那么 index=n (n<=m) 的位置肯…
864 AlvinZH的儿时回忆----蛙声一片 题目链接:https://buaacoding.cn/problem/865/index 思路 中等题.难点在于理解题意!仔细读题才能弄懂题目规则.整个过程是通过模拟位置变化进行的. 第一个问题是AlvinZH的情绪变化,忽略某一位置的青蛙条件是:刚刚经历失败,即前一位置没有抓到青蛙. 第二个问题是什么情况抓到青蛙:不灰心的情况遇到多只青蛙,除去跳的最远的青蛙(可能多只),剩下的都被抓. 分析 像这种数据循环利用且不断变化,但是有序的数据集,应该…
864 AlvinZH的儿时梦想----机器人篇 题目链接:https://buaacoding.cn/problem/868/index 思路 中等题. 判断无限玩耍: \(p\) 的值能够承担的起所有机器的消耗.即比较 \(\sum_{i=1}^{n}a_i\) 与 \(p\) 的大小. 分析 本题有两种解法. 方法一:二分. 即二分枚举最长时间,判断充电器能否支撑此时间所有的耗能,不断缩小时间范围,最后可求得答案.难点在判断函数,比较在当前时间条件下,所有需要充电的机器需要的能量能量总和与…
870 斐波那契进阶 题目链接:https://buaacoding.cn/problem/870/index 思路 通过读题就可以发现这不是一般的求斐波那契数列,所以用数组存下所有的答案是不现实的.题目也明确点明此题可以利用矩阵的计算解题. 如果你稍微百度一下你会了解到快速矩阵幂的概念. 什么是快速矩阵幂? 分析 快速矩阵幂算法是一种简单的具有典型意义的连续为离散算法,同学们一定要掌握其思想,而不是从网上copy一份板子就用. 时间复杂度:\(O(lgN)\): 考点:简单的快速矩阵幂: 坑点…
858 群鸦的盛宴 题目链接:https://buaacoding.cn/problem/858/index 思路 本题乍一眼看过去,你可能会想到使用一个二维数组A[51][51]来记录从i到j的路线数. 你很厉害,这是DP的思想.可是什么情况才用DP:分解得到子问题往往不是互相独立的.这也是DP和分治的最大区别之一.这题我从a走到b,和a之前b之后的格子完全没有关系啊! so,冷静一下再看看,你会发现从1走到3和从2走到4其实是一样的,然后你会发现答案只与\(b-a\)有关. 举几个例子吧,1…
朴素的中位数 题目链接:https://buaacoding.cn/problem/846/index 分析 题意很简单,就是给定了两个从小到大排好序的数组,找出这两个数组合起来的数据中的中位数. 方法应该比较多,很容易想的比如直接合并成两个数组然后对大数组sort()排序:又因为两个数组都已经是各自有序的了,可以联想一下归并排序中合并数组的方式直接得到有序的大数组,这样会快很多(这也是出这道题的本意):应该也可以用找第k小数的方法利用快排的方式直接找中位数.当然因为没有太卡时间,所以方法随意.…
872 AlvinZH的儿时梦想----坦克篇 思路 简单题.仔细看题,题目意在找到直线穿过的矩形数最小,不能从两边穿过.那么我们只要知道每一行矩形之间的空隙位置就可以了. 如果这里用二维数组记住每一个空隙的位置,一是没有必要,二是记录了还要大量的处理才能得到答案.反正我是没想过要怎么处理. 可以发现,要得到本题的答案,只要找到空隙最多的哪个位置,我们取左边参考点,每一行的空隙位置我们可以记录到同一个数组里,即用A[pos]代表pos位置的直线有多少个空隙.但是发现总长度有点大,用数组是不可能了…
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可…
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] =…
1082 AlvinZH的学霸养成记VI 思路 难题,凸包. 分析问题,平面上给出两类点,问能否用一条直线将二者分离. 首先应该联想到这是一个凸包问题,分别计算两类点的凸包,如果存在符合题意的直线,那么这两个凸包(凸多边形)一定是不相交的. 计算凸包一般有两种方法,Graham扫描法和Jarvis步进法. Graham扫描法比较简单,好理解,书中也有伪代码.先找到最左下点P0,对剩下的点相对P0进行极角排序.然后依次进栈判断.当算法终止时,栈中从底部到顶部,依次是按逆时针方向排列的凸包中的点(有…
1039 AlvinZH的学霸养成记IV 思路 难题,最大二分图匹配. 难点在于如何转化问题,n对n,一个只能攻击一个,判断是否存在一种攻击方案我方不死团灭对方.可以想到把所有随从看作点,对于可攻击的两个随从间连上边,这样就把问题转化为图了. 需要注意的是属性值的转化:免疫可看做生命值无限,剧毒可看做攻击力无限.(需要一点小小的机智) 图建好了,接下来怎么办呢?假设存在一种方案满足题意,那就是每个我方随从都可以找到敌方随从攻击,由于要团灭,只能存在一对一的情况,不存在多对一或一对多.如何表达这个…
850 AlvinZH的学霸养成记III 思路 难题.概率DP. 第一种思考方式:直接DP dp[i]:从已经有i个学霸到所有人变成学霸的期望. 那么答案为dp[1],需要从后往前逆推.对于某一天,有可能会增加一个学霸or不增加. ①增加:\((dp[i+1] + 1) * P\) ②不增加:\((dp[i] + 1) * (1-P)\) 其中,\(P = i * (n - i) * p / (C(n,2))\),C(n,2) = (n - 1) * n / 2.其含义是:n个人中选出一非学霸一…
940 AlvinZH的最"长"公共子序列 思路 DP,难题. \(dp[i][j]\) :记录A的前i个字符与B的前j个字符变成相同需要的最小操作数. 初始化:dp[i][0] = i, dp[0][i] = i.分别代表i次删除or添加操作. 三种操作得到dp[i][j],取其中最小值: 替换:可能不需要替换,所以是dp[i-1][j-1]+Same(A[i-1],B[j-1]): 删除:dp[i-1][j]+1: 添加:dp[i][j-1]+1. 千万不要纠结操作的序列是A还是B…
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)\…
905 AlvinZH的奇幻猜想--三次方 思路 中等题.题意简单,题目说得简单,把一个数分成多个立方数的和,问最小立方数个数. 脑子转得快的马上想到贪心,从最近的三次方数往下减,反正有1^3在最后撑着保证减完.不好意思这是错的,因为1,27,64,125...等立方数之间并不是倍数关系,不能构成贪心策略.举个反例:96=64+8+8+8+8=64+27+1+1+1+1+1,答案明显是5,而贪心会算到7. 既然不是贪心,那就是DP了,没毛病.先讲一下常规做法吧,是这样想的:相当于把一个数化成几份…
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; 分析 贪心证明:…
1081 AlvinZH的学霸养成记V 思路 中等题,计算几何. 这是一个排序问题,按极角排序.可以转化为叉积的应用,对于点A和B,通过叉积可以判断角度大小,共线时再判断距离. 叉积的应用.OA × OB = x1y2 - x2y1. OA × OB > 0:OA在OB的顺时针180°内: OA × OB = 0:三点共线,方向不一定相同: OA × OB < 0:OA在OB的逆时针180°内. 分析 注意数据范围,建议使用double.long long还是少用些好,真的. 参考代码 #in…
1032 AlvinZH的学霸养成记II 思路 中等题,贪心. 所有课程按照DDL的大小来排序. 维护一个当前时间curTime,初始为0. 遍历课程,curTime加上此课程持续时间d,如果这时curTime大于此课程DDL,表示无法学习此课程,但是我们不减去此课程,而是减去用时最长的那门课程(优先队列队首,课时最长). 贪心: 假设当前课程为B,被替换课程为A,则有A.d≥B.d,A.e≤B.e.既然curTime+A.d≤A.e,那么curTime+B.d≤B.e绝对成立,保证了B的合法性…
1063 wuli51和京导的毕业旅行 思路 中等题,二分+贪心. 简化题意,将m+1个数字分成n份,ans为这n段中每段数字和的最大值,求ans最小值及其方案. 对于这种求最小的最大值,最常用的方法是二分.答案一定在[0,sum]之间,通过判断是否符合要求可以求得ans.在本题中,ans一定是整数,所以二分过程中left.mid.right也是整数. 如何判断是否符合要求?对于某一mid值,遍历一次露营地距离数组,通过贪心,总是使一天内的行程尽可能接近mid,但不可超过mid.若是加上某一露营…
975 AlvinZH的1021实验 思路 贪心,简单题. 题目已经说明有且只有一种方法表示所求数,简单列举几项可以发现只由前i个砝码会可以表示[1,∑Wi]的所有数的.先找到最大需要的砝码Wi,问题变成了表示(n-Wi),可递归,可循环.见看考代码一. 本题亦可联想到三进制,思路清奇.可以参考段柯宇同学的题解. 分析 简单讲讲为什么,贪心在哪里.令W[6]={1,3,9,27,81,243}表示砝码重量,Sum[6] = {1,4,13,40,121,364}表示前i个砝码总和. 可以发现W[…
862-AlvinZH的儿时梦想--运动员篇 思路 难题. 应该想到,不管给出的数据如何,每一个淘汰的人不会对最终答案产生任何影响,所以每次淘汰就把人除掉就可以了,最后剩下的两个人计算它们从开始到相遇需要的时间就可以了. 首先对每个人根据初始位置进行排序,因为相遇总是先发生在相邻的两个人身上的,所以一开始先对相邻的人两两计算相遇时间,然后把相遇时间放进优先队列里(保证时间短的优先出队),然后依次出队,判定见面的两个人中哪个会被淘汰,然后把淘汰的人除去,维护新建立起来的相邻关系,以及新的相遇时间放…
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…
题目描述 北航2018级软件学院算法分析与设计第一次上机第三题 样例 实现解释 题目类型: 这类题目其实就是典型的递归分析语句形式的问题,也是编译原理课程中语法分析的重要方法之一. 解决方案: 为了解决这类问题,可以利用多函数递归调用的方法解决,针对本题即:编写两个函数分别用于判断是否为pair以及是否为type.(这里的是否为pair是指判断是否为一个完整的pair结构体) 判断pair函数的构造原因是作为首次调用的函数,在其中调用其他的判断函数,并且由题意可知在判断type时也是需要判断pa…
1124 ModricWang's Fight with DDLs I 思路 这道题本质上就是一个多项式求值,题目中的n需要手动算一下,单位复根可以根据复数的性质来求,即\(e^{i\pi}+1=0\),对指数\(i\pi\)进行乘除就能得到各个单位复根,带进多项式即可得到答案.需要注意的是,这里的函数次数k很小,因此时间复杂度为\(O(k^2)\) 的朴素算法是完全没有问题的.如果k大一些,就可以使用FFT了,这个题的题面在做的其实就是求一次FFT.希望通过这一个题帮助大家巩固一下FFT的定义…
Bamboo之吃我一拳 分析 当两个点的距离<=d时,才可以出拳,想要使得满足出拳条件的点对最少但不为0 寻找最近点对距离,得到的最近距离能够使得可以出拳的组数最少,因为除了最近点对外其他组合均不符合条件. 在一堆点中找到两个点的距离最小,暴力的O(n^2)计算量很恐怖,可以用分治思想把问题变小: 把平面上的点分为两拨,距离最近的两个点只可能出现在:第一堆,第二堆,和两堆2中各自一个点 分解 想象一条垂直线把所给点集分成两拨:所有的点要么在直线左边,要么在其右边.按x坐标升序排列. 解决 划分后…